#include <stdlib.h>
#include <TClonesArray.h>
#include <TTree.h>
#include <TBranch.h>
#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliLoader.h"
#include "AliLog.h"
#include "AliDigitizationInput.h"
#include "AliITSUDigitizer.h"
#include "AliITSUGeomTGeo.h"
#include "AliITSUSimulation.h"
#include "AliITSUSDigit.h"
ClassImp(AliITSUDigitizer)
AliITSUDigitizer::AliITSUDigitizer()
: fITS(0)
,fModActive(0)
,fInit(kFALSE)
,fRoif(-1)
,fRoiifile(0)
,fFlagFirstEv(kTRUE)
{
}
AliITSUDigitizer::AliITSUDigitizer(AliDigitizationInput* digInp)
:AliDigitizer(digInp)
,fITS(0)
,fModActive(0)
,fInit(kFALSE)
,fRoif(-1)
,fRoiifile(0)
,fFlagFirstEv(kTRUE)
{
}
AliITSUDigitizer::~AliITSUDigitizer()
{
fITS = 0;
delete[] fModActive;
}
Bool_t AliITSUDigitizer::Init()
{
if (fInit) return kTRUE;
fInit = kTRUE;
if(!gAlice) {
fITS = 0;
fRoiifile = 0;
fInit = kFALSE;
AliFatal("gAlice not found");
}
fITS = (AliITSU *)(gAlice->GetDetector("ITS"));
if(!fITS){
fRoiifile = 0;
fInit = kFALSE;
AliFatal("ITS not found");
}
if (!fITS->IsSimInitDone()) fITS->InitSimulation();
int nm = fITS->GetITSGeomTGeo()->GetNChips();
fModActive = new Bool_t[nm];
for (Int_t i=nm;i--;) fModActive[i] = kTRUE;
return fInit;
}
void AliITSUDigitizer::Digitize(Option_t* )
{
if (!fInit) AliFatal("Init not successful, aborting.");
Int_t nfiles = GetDigInput()->GetNinputs();
Int_t event = GetDigInput()->GetOutputEventNr();
TString loadname = Form("%sLoader",fITS->GetName());
AliITSUGeomTGeo* geom = fITS->GetITSGeomTGeo();
Int_t nChips = geom->GetNChips();
Bool_t lmod;
Int_t *fl = new Int_t[nfiles];
fl[0] = fRoiifile;
int mask = 1;
for (int id=0;id<nfiles;id++) if(id!=fRoiifile) fl[mask++] = id;
TClonesArray * sdig = new TClonesArray( "AliITSUSDigit",1000 );
AliRunLoader *inRL = 0x0, *outRL = 0x0;
AliLoader *ingime = 0x0, *outgime = 0x0;
outRL = AliRunLoader::GetRunLoader(fDigInput->GetOutputFolderName());
if (!outRL) AliFatal("Can not get Output Run Loader");
outRL->GetEvent(event);
outgime = outRL->GetLoader(loadname);
if ( outgime == 0x0) AliFatal("Can not get Output ITS Loader");
outgime->LoadDigits("update");
if (outgime->TreeD() == 0x0) outgime->MakeTree("D");
fITS->MakeBranchInTreeD(outgime->TreeD());
if(fRoif!=0) AliDebug(1,"Region of Interest digitization selected");
else AliDebug(1,"No Region of Interest selected. Digitizing everything");
for (int ifiles=0; ifiles<nfiles; ifiles++ ) {
inRL = AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(fl[ifiles]));
ingime = inRL->GetLoader(loadname);
if (ingime->TreeS() == 0x0) ingime->LoadSDigits();
}
for (int chip=0; chip<nChips; chip++ ) {
if (!fRoif && !fModActive[chip]) continue;
int lr = geom->GetLayer(chip);
AliITSUSimulation *sim = fITS->GetSimulationModel(lr);
if (!sim) AliFatal(Form("The simulation model for layer %d is not available",lr));
sim->InitSimulationChip(fITS->GetChip(chip), event, fITS->GetSegmentation(lr), fITS->GetResponseParam(lr));
for (int ifiles=0; ifiles<nfiles; ifiles++ ) {
if (!fRoif && !fModActive[chip]) continue;
inRL = AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(fl[ifiles]));
ingime = inRL->GetLoader(loadname);
TTree *treeS = ingime->TreeS();
fITS->SetTreeAddress();
if( !treeS ) continue;
TBranch *brchSDigits = treeS->GetBranch( fITS->GetName() );
if( brchSDigits ) brchSDigits->SetAddress( &sdig );
else {
AliError(Form("branch ITS not found in TreeS, input file %d ", ifiles));
delete [] fl;
return;
}
sdig->Clear();
mask = GetDigInput()->GetMask(ifiles);
brchSDigits->GetEvent( chip );
lmod = sim->AddSDigitsToChip(sdig,mask);
if(GetRegionOfInterest() && !ifiles) fModActive[chip] = lmod;
}
sim->FinishSDigitiseChip();
outgime->TreeD()->Fill();
fITS->ResetDigits();
}
outgime->TreeD()->AutoSave();
outgime->WriteDigits("OVERWRITE");
outgime->UnloadDigits();
for(int ifiles=0; ifiles<nfiles; ifiles++ ) {
inRL = AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(fl[ifiles]));
ingime = inRL->GetLoader(loadname);
ingime->UnloadSDigits();
}
delete[] fl;
sdig->Clear();
delete sdig;
for (Int_t i=nChips;i--;) fModActive[i] = kTRUE;
return;
}
void AliITSUDigitizer::SetByRegionOfInterest(TTree *ts)
{
if (fRoif==0) return;
if (ts==0) return;
TBranch *brchSDigits = ts->GetBranch(fITS->GetName());
TClonesArray * sdig = new TClonesArray( "AliITSUSDigit",1000 );
if( brchSDigits ) brchSDigits->SetAddress( &sdig );
else {AliError("Branch ITS not found in TreeS"); return;}
int nm = fITS->GetITSGeomTGeo()->GetNChips();
for (int m=0;m<nm;m++) {
fModActive[m] = kFALSE;
sdig->Clear();
brchSDigits->GetEvent(m);
int ndig = sdig->GetEntries();
for(int i=0;i<ndig;i++) {
if ( ((AliITSUSDigit*)sdig->At(m))->GetSumSignal()>0.0 ) {
fModActive[m] = kTRUE;
break;
}
}
}
AliDebug(1,"Digitization by Region of Interest selected");
sdig->Clear();
delete sdig;
return;
}