* provided "as is" without express or implied warranty. *
**************************************************************************/
-/*
-$Log$
-*/
+/* $Id$ */
+///////////////////////////////////////////////////////////////////////////
+//Piotr.Skowronski@cern.ch : //
+//Corrections applied in order to compile (only) //
+// with new I/O and folder structure //
+//To be implemented correctly by responsible //
+// //
+// Class used to steer //
+// the digitization for ITS //
+// //
+///////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
-#include <iostream.h>
-#include <TObjArray.h>
+#include <TClonesArray.h>
#include <TTree.h>
#include <TBranch.h>
-#include <AliRun.h>
-#include <AliRunDigitizer.h>
-
+#include "AliRun.h"
+#include "AliRunLoader.h"
+#include "AliLoader.h"
+#include "AliLog.h"
+#include "AliRunDigitizer.h"
#include "AliITSDigitizer.h"
-#include "AliITShit.h"
-#include "AliITSmodule.h"
-#include "AliITSsimulation.h"
-#include "AliITSDetType.h"
#include "AliITSgeom.h"
+#include "AliITSsimulation.h"
ClassImp(AliITSDigitizer)
//______________________________________________________________________
-AliITSDigitizer::AliITSDigitizer() : AliDigitizer(){
+AliITSDigitizer::AliITSDigitizer() : AliDigitizer(),
+fITS(0),
+fModActive(0),
+fInit(kFALSE),
+fRoif(-1),
+fRoiifile(0),
+fFlagFirstEv(kTRUE){
// Default constructor. Assign fITS since it is never written out from
// here.
// Inputs:
// Return:
// A blank AliITSDigitizer class.
- fITS = 0;
}
//______________________________________________________________________
-AliITSDigitizer::AliITSDigitizer(AliRunDigitizer *mngr) : AliDigitizer(mngr){
+AliITSDigitizer::AliITSDigitizer(AliRunDigitizer *mngr) : AliDigitizer(mngr),
+fITS(0),
+fModActive(0),
+fInit(kFALSE),
+fRoif(-1),
+fRoiifile(0),
+fFlagFirstEv(kTRUE){
// Standard constructor. Assign fITS since it is never written out from
// here.
// Inputs:
// Return:
// An AliItSDigitizer class.
- fITS = 0;
}
+
+
//______________________________________________________________________
AliITSDigitizer::~AliITSDigitizer(){
// Default destructor.
// none.
// Return:
// none.
-
fITS = 0; // don't delete fITS. Done else where.
+ if(fModActive) delete[] fModActive;
}
-
//______________________________________________________________________
Bool_t AliITSDigitizer::Init(){
- // Iniliztion
+ // Initialization. Set up region of interest, if switched on, and
+ // loads ITS and ITSgeom.
// Inputs:
// none.
// Outputs:
// Return:
// none.
-// if(GetHits()) fITS->fHits = new TClonesArray("AliITSHit",1000);
- return kTRUE;
+ fInit = kTRUE; // Assume for now init will work.
+ if(!gAlice) {
+ fITS = 0;
+ fRoiifile = 0;
+ fInit = kFALSE;
+ Warning("Init","gAlice not found");
+ return fInit;
+ } // end if
+ fITS = (AliITS *)(gAlice->GetDetector("ITS"));
+ if(!fITS){
+ fRoiifile = 0;
+ fInit = kFALSE;
+ Warning("Init","ITS not found");
+ return fInit;
+ } else if(fITS->GetITSgeom()){
+ //cout << "fRoif,fRoiifile="<<fRoif<<" "<<fRoiifile<<endl;
+ fModActive = new Bool_t[fITS->GetITSgeom()->GetIndexMax()];
+ } else{
+ fRoiifile = 0;
+ fInit = kFALSE;
+ Warning("Init","ITS geometry not found");
+ return fInit;
+ } // end if
+ // fModActive needs to be set to a default all kTRUE value
+ for(Int_t i=0;i<fITS->GetITSgeom()->GetIndexMax();i++) fModActive[i] = kTRUE;
+ return fInit;
}
//______________________________________________________________________
void AliITSDigitizer::Exec(Option_t* opt){
- // Main digitizing function.
+ // Main digitization function.
// Inputs:
- // Option_t * opt list of subdetector to digitize. =0 all.
+ // Option_t * opt list of sub detector to digitize. =0 all.
// Outputs:
// none.
// Return:
// none.
- Int_t size=0,ifls=0,trk=0,ntracks=0,h=0,nhit=0;
- TTree *treeH=0;
- TBranch *brchHits=0;
- AliITShit *itsHit=0;
+
char name[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- char *all;
+ const char *all;
const char *det[3] = {strstr(opt,"SPD"),strstr(opt,"SDD"),
strstr(opt,"SSD")};
- if(!det[0] && !det[1] && !det[2]) all = "All";
+ if( !det[0] && !det[1] && !det[2] ) all = "All";
else all = 0;
+ Int_t nfiles = GetManager()->GetNinputs();
+ Int_t event = GetManager()->GetOutputEventNr();
AliITSsimulation *sim = 0;
- AliITSDetType *iDetType = 0;
- AliITSmodule *mod = 0;
- Int_t id=0,module=0,nfls=0,mask=0;
- static Bool_t setDef=kTRUE;
-
- if(!fITS) fITS = (AliITS*)(gAlice->GetDetector("ITS"));
- if(!(fITS->GetITSgeom())){
- Warning("Exec","Need ITS geometry to be properly defined first.");
- return; // need transformations to do digitization.
- } // end if !GetITSgeom()
- if (setDef) fITS->SetDefaultSimulation();
- setDef=kFALSE;
- sprintf(name,"%s",fITS->GetName());
- if(!GetModules()) {
- fITS->InitModules(0,size);
+ if(fFlagFirstEv){
+ fITS->SetDefaults();
+ fITS->SetDefaultSimulation();
+ fFlagFirstEv=kFALSE;
+ }
+ if(!fInit){
+ Error("Exec","Init not successful, aborting.");
+ return;
} // end if
- nfls = GetManager()->GetNinputs();
- for(ifls=0;ifls<nfls;ifls++){
- treeH = GetManager()->GetInputTreeH(ifls);
- if(!(treeH && GetHits())) continue;
- brchHits = treeH->GetBranch(name);
- if(brchHits){
- GetHits()->Clear();
- fITS->SetHitsAddressBranch(brchHits);
- } else{
- Error("Exec","branch ITS not found");
- } // end if brchHits
-
- ntracks = (Int_t) treeH->GetEntries();
- for(trk=0;trk<ntracks;trk++){
- GetHits()->Clear();
- brchHits->GetEntry(trk);
- nhit = GetHits()->GetEntries();
- mask = GetManager()->GetMask(ifls);
- for(h=0;h<nhit;h++){
- itsHit = GetHit(h);
- mod = GetModule(itsHit->GetModule());
- id = fITS->GetITSgeom()->GetModuleType(module);
- if (!all && !det[id]) continue;
- mod->AddHit(itsHit,trk+mask,h);
- } // end for h
- } // end for trk
- } // end for ifls
-
- // Digitize
- fITS->MakeBranchInTreeD(GetManager()->GetTreeD());
- for(module=0;module<size;module++){
- id = fITS->GetITSgeom()->GetModuleType(module);
- if (!all && !det[id]) continue;
- iDetType = fITS->DetType(id);
- sim = (AliITSsimulation*)iDetType->GetSimulationModel();
- if (!sim) {
- Error("Exec","The simulation class was not instanciated!");
+ sprintf(name,"%s",fITS->GetName());
+
+ Int_t size = fITS->GetITSgeom()->GetIndexMax();
+ Int_t module,id,ifiles,mask;
+ Bool_t lmod;
+ Int_t *fl = new Int_t[nfiles];
+ fl[0] = fRoiifile;
+ mask = 1;
+ for(id=0;id<nfiles;id++)
+ if(id!=fRoiifile)
+ {
+ // just in case fRoiifile!=0.
+ fl[mask] = id;
+ mask++;
+ } // end for,if
+ TClonesArray * sdig = new TClonesArray( "AliITSpListItem",1000 );
+
+ TString loadname(name);
+ loadname+="Loader";
+
+ AliRunLoader *inRL = 0x0, *outRL = 0x0;
+ AliLoader *ingime = 0x0, *outgime = 0x0;
+
+ outRL = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
+ if ( outRL == 0x0)
+ {
+ Error("Exec","Can not get Output Run Loader");
+ return;
+ }
+ outRL->GetEvent(event);
+ outgime = outRL->GetLoader(loadname);
+ if ( outgime == 0x0)
+ {
+ Error("Exec","Can not get Output ITS Loader");
+ return;
+ }
+
+ outgime->LoadDigits("update");
+ if (outgime->TreeD() == 0x0) outgime->MakeTree("D");
+
+ // Digitize
+ fITS->MakeBranchInTreeD(outgime->TreeD());
+ if(fRoif!=0) {
+ AliDebug(1,"Region of Interest digitization selected");
+ }
+ else {
+ AliDebug(1,"No Region of Interest selected. Digitizing everything");
+ }
+ if(fModActive==0) fRoif = 0; // fModActive array must be define for RIO cuts.
+
+ for(ifiles=0; ifiles<nfiles; ifiles++ )
+ {
+ inRL = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(fl[ifiles]));
+ ingime = inRL->GetLoader(loadname);
+ if (ingime->TreeS() == 0x0) ingime->LoadSDigits();
+ }
+
+ for(module=0; module<size; module++ )
+ {
+ if(fModActive && fRoif!=0) if(!fModActive[module]) continue;
+ id = fITS->GetITSgeom()->GetModuleType(module);
+ if(!all && !det[id]) continue;
+ sim = (AliITSsimulation*)fITS->GetSimulationModel(id);
+ if(!sim) {
+ Error( "Exec", "The simulation class was not instanciated!" );
exit(1);
} // end if !sim
- mod = GetModule(module);
- sim->DigitiseModule(mod,module,0);
+ // Fill the module with the sum of SDigits
+ sim->InitSimulationModule(module, event);
+ //cout << "Module=" << module;
+ for(ifiles=0; ifiles<nfiles; ifiles++ )
+ {
+ if(fRoif!=0) if(!fModActive[module]) continue;
+
+ inRL = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(fl[ifiles]));
+ ingime = inRL->GetLoader(loadname);
+
+ TTree *treeS = ingime->TreeS();
+ fITS->SetTreeAddress();
+
+ if( !treeS ) continue;
+ TBranch *brchSDigits = treeS->GetBranch( name );
+ if( brchSDigits )
+ {
+ brchSDigits->SetAddress( &sdig );
+ } else {
+ Error( "Exec", "branch ITS not found in TreeS, input file %d ",
+ ifiles );
+ return;
+ } // end if brchSDigits
+ sdig->Clear();
+ mask = GetManager()->GetMask(ifiles);
+ // add summable digits to module
+ brchSDigits->GetEvent( module );
+ lmod = sim->AddSDigitsToModule(sdig,mask);
+ if(fRegionOfInterest && (ifiles==0))
+ {
+ fModActive[module] = lmod;
+ } // end if
+ } // end for ifiles
+ //cout << " end ifiles loop" << endl;
+ // Digitize current module sum(SDigits)->Digits
+ sim->FinishSDigitiseModule();
+
// fills all branches - wasted disk space
- GetManager()->GetTreeD()->Fill();
- fITS->ResetDigits();
+ outgime->TreeD()->Fill();
+ fITS->ResetDigits();
} // end for module
-
- fITS->ClearModules();
-
- GetManager()->GetTreeD()->GetEntries();
- GetManager()->GetTreeD()->Write(0,TObject::kOverwrite);
- // reset tree
- GetManager()->GetTreeD()->Reset();
+
+ outgime->TreeD()->AutoSave();
+ outgime->WriteDigits("OVERWRITE");
+ outgime->UnloadDigits();
+ for(ifiles=0; ifiles<nfiles; ifiles++ )
+ {
+ inRL = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(fl[ifiles]));
+ ingime = inRL->GetLoader(loadname);
+ ingime->UnloadSDigits();
+ }
+
+ delete[] fl;
+ sdig->Clear();
+ delete sdig;
+ for(Int_t i=0;i<fITS->GetITSgeom()->GetIndexMax();i++) fModActive[i] = kTRUE;
+
+
+ return;
+}
+//______________________________________________________________________
+void AliITSDigitizer::SetByRegionOfInterest(TTree *ts){
+ // Scans through the ITS branch of the SDigits tree, ts, for modules
+ // which have SDigits in them. For these modules, a flag is set to
+ // digitize only these modules. The value of fRoif determines how many
+ // neighboring modules will also be turned on. fRoif=0 will turn on only
+ // those modules with SDigits in them. fRoif=1 will turn on, in addition,
+ // those modules that are +-1 module from the one with the SDigits. And
+ // So on. This last feature is not supported yet.
+ // Inputs:
+ // TTree *ts The tree in which the existing SDigits will define the
+ // region of interest.
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+ Int_t m,nm,i;
+
+ if(fRoif==0) return;
+ if(ts==0) return;
+ TBranch *brchSDigits = ts->GetBranch(fITS->GetName());
+ TClonesArray * sdig = new TClonesArray( "AliITSpListItem",1000 );
+ //cout << "Region of Interest ts="<<ts<<" brchSDigits="<<brchSDigits<<" sdig="<<sdig<<endl;
+
+ if( brchSDigits ) {
+ brchSDigits->SetAddress( &sdig );
+ } else {
+ Error( "SetByRegionOfInterest","branch ITS not found in TreeS");
+ return;
+ } // end if brchSDigits
+
+ nm = fITS->GetITSgeom()->GetIndexMax();
+ for(m=0;m<nm;m++){
+ //cout << " fModActive["<<m<<"]=";
+ fModActive[m] = kFALSE; // Not active by default
+ sdig->Clear();
+ brchSDigits->GetEvent(m);
+ if(sdig->GetLast()>=0) for(i=0;i<sdig->GetLast();i++){
+ // activate the necessary modules
+ if(((AliITSpList*)sdig->At(m))->GetpListItem(i)->GetSignal()>0.0){ // Must have non zero signal.
+ fModActive[m] = kTRUE;
+ break;
+ } // end if
+ } // end if. end for i.
+ //cout << fModActive[m];
+ //cout << endl;
+ } // end for m
+ AliDebug(1,"Digitization by Region of Interest selected");
+ sdig->Clear();
+ delete sdig;
+ return;
}