* provided "as is" without express or implied warranty. *
**************************************************************************/
-/*
-$Log$
-Revision 1.1 2001/11/27 16:27:28 nilsen
-Adding AliITSDigitizer class to do merging and digitization . Based on the
-TTask method. AliITSDigitizer class added to the Makefile and ITSLinkDef.h
-file. The following files required minor changes. AliITS, added functions
-SetHitsAddressBranch, MakeBranchInTreeD and modified MakeBranchD.
-AliITSsimulationSDD.cxx needed a Tree indepenent way of returning back to
-the original Root Directory in function Compress1D. Now it uses gDirectory.
-
-Revision 1.2 2002/03/01 E. Lopez
-Diditization changed to start from SDigits instead of Hits.
-The SDigits are reading as TClonesArray of AliITSpListItem
-*/
+/* $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;
- fActive = 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.
- if(!gAlice) {
- fITS = 0;
- fActive = 0;
- return;
- } // end if
- fITS = (AliITS *)(gAlice->GetDetector("ITS"));
- if(!fITS){
- fActive = 0;
- return;
- } else if(fITS->GetITSgeom()){
- fActive = new Bool_t[fITS->GetITSgeom()->GetIndexMax()];
- } else{
- fActive = 0;
- return;
- } // end if
- // fActive needs to be set to a default all kTRUE value
- for(Int_t i=0;i<fITS->GetITSgeom()->GetIndexMax();i++) fActive[i] = kTRUE;
}
+
+
//______________________________________________________________________
AliITSDigitizer::~AliITSDigitizer(){
// Default destructor.
// none.
// Return:
// none.
-
fITS = 0; // don't delete fITS. Done else where.
- if(fActive) delete[] fActive;
+ 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:
// none.
// Return:
// none.
- 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.
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";
else all = 0;
+ Int_t nfiles = GetManager()->GetNinputs();
+ Int_t event = GetManager()->GetOutputEventNr();
AliITSsimulation *sim = 0;
- AliITSDetType *iDetType = 0;
- static Bool_t setDef = kTRUE;
-
- if( !fITS ) fITS = (AliITS*)(gAlice->GetDetector("ITS"));
- if(!fITS){
- Error("Exec","The ITS not found. aborting.");
+ if(fFlagFirstEv){
+ fITS->SetDefaults();
+ fITS->SetDefaultSimulation();
+ fFlagFirstEv=kFALSE;
+ }
+ if(!fInit){
+ Error("Exec","Init not successful, aborting.");
return;
} // end if
- 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() );
+ sprintf(name,"%s",fITS->GetName());
- Int_t nfiles = GetManager()->GetNinputs();
- Int_t event = GetManager()->GetOutputEventNr();
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 );
- // Digitize
- fITS->MakeBranchInTreeD( GetManager()->GetTreeD() );
-
- for( Int_t module=0; module<size; module++ ){
- if(fActive) if(!fActive[module]) continue;
- Int_t id = fITS->GetITSgeom()->GetModuleType( module );
- if( !all && !det[id] ) continue;
- iDetType = fITS->DetType( id );
- sim = (AliITSsimulation*)iDetType->GetSimulationModel();
- if( !sim ) {
+ 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
-
- // Fill the module with the sum of SDigits
- sim->InitSimulationModule( module, event );
- cout << "Module=" << module;
- for( Int_t ifiles=0; ifiles<nfiles; ifiles++ ){
- cout <<" ifiles=" << ifiles;
- TTree *treeS = GetManager()->GetInputTreeS( ifiles );
- if( !(treeS && fITS->GetSDigits()) ) continue;
- TBranch *brchSDigits = treeS->GetBranch( name );
- if( brchSDigits ) {
+ // 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 && fITS->GetSDigits()) ) 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();
- Int_t mask = GetManager()->GetMask( ifiles );
-
+ mask = GetManager()->GetMask(ifiles);
// add summable digits to module
brchSDigits->GetEvent( module );
- sim->AddSDigitsToModule( sdig, mask );
+ lmod = sim->AddSDigitsToModule(sdig,mask);
+ if(fRegionOfInterest && (ifiles==0))
+ {
+ fModActive[module] = lmod;
+ } // end if
} // end for ifiles
- cout << " end ifiles loop" << endl;
- // Digitise current module sum(SDigits)->Digits
- sim->FinishSDigitiseModule();
+ //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
- cout << "end modules loop"<<endl;
-
- 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;
}