1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 Revision 1.3.4.1 2002/06/10 17:51:14 hristov
21 Revision 1.4 2002/04/24 22:08:12 nilsen
22 New ITS Digitizer/merger with two macros. One to make SDigits (old way) and
23 one to run the merger (modified for Jiri).
25 Revision 1.3 2002/03/25 10:48:55 nilsen
26 New ITS SDigit merging with region of interest cut. Update for changes in
27 AliDigitizer. Additional optimization should be done.
29 Revision 1.2 2002/03/15 17:26:40 nilsen
30 New SDigit version of ITS Digitizer.
32 Revision 1.1 2001/11/27 16:27:28 nilsen
33 Adding AliITSDigitizer class to do merging and digitization . Based on the
34 TTask method. AliITSDigitizer class added to the Makefile and ITSLinkDef.h
35 file. The following files required minor changes. AliITS, added functions
36 SetHitsAddressBranch, MakeBranchInTreeD and modified MakeBranchD.
37 AliITSsimulationSDD.cxx needed a Tree independent way of returning back to
38 the original Root Directory in function Compress1D. Now it uses gDirectory.
40 Revision 1.2 2002/03/01 E. Lopez
41 Digitization changed to start from SDigits instead of Hits.
42 The SDigits are reading as TClonesArray of AliITSpListItem
47 #include <TObjArray.h>
53 #include <AliRunDigitizer.h>
55 #include "AliITSDigitizer.h"
56 #include "AliITSpList.h"
57 #include "AliITSmodule.h"
58 #include "AliITSsimulation.h"
59 #include "AliITSDetType.h"
60 #include "AliITSgeom.h"
62 ClassImp(AliITSDigitizer)
64 //______________________________________________________________________
65 AliITSDigitizer::AliITSDigitizer() : AliDigitizer(){
66 // Default constructor. Assign fITS since it is never written out from
69 // Option_t * opt Not used
73 // A blank AliITSDigitizer class.
81 //______________________________________________________________________
82 AliITSDigitizer::AliITSDigitizer(AliRunDigitizer *mngr) : AliDigitizer(mngr){
83 // Standard constructor. Assign fITS since it is never written out from
86 // Option_t * opt Not used
90 // An AliItSDigitizer class.
98 //______________________________________________________________________
99 AliITSDigitizer::~AliITSDigitizer(){
100 // Default destructor.
102 // Option_t * opt Not used
108 fITS = 0; // don't delete fITS. Done else where.
109 if(fActive) delete[] fActive;
111 //______________________________________________________________________
112 Bool_t AliITSDigitizer::Init(){
113 // Initialization. Set up region of interest, if switched on, and
114 // loads ITS and ITSgeom.
122 fInit = kTRUE; // Assume for now init will work.
129 Warning("Init","gAlice not found");
132 fITS = (AliITS *)(gAlice->GetDetector("ITS"));
138 Warning("Init","ITS not found");
140 } else if(fITS->GetITSgeom()){
141 //cout << "fRoif,fRoiifile="<<fRoif<<" "<<fRoiifile<<endl;
142 fActive = new Bool_t[fITS->GetITSgeom()->GetIndexMax()];
148 Warning("Init","ITS geometry not found");
151 // fActive needs to be set to a default all kTRUE value
152 for(Int_t i=0;i<fITS->GetITSgeom()->GetIndexMax();i++) fActive[i] = kTRUE;
153 /* This will not work from Init. ts is aways returned as zero.
155 if(fRoif>=0 && fRoiifile>=0 && fRoiifile<GetManager()->GetNinputs()){
156 ts = GetManager()->GetInputTreeS(fRoiifile);
158 if(!gAlice) ts = gAlice->TreeS();
160 cout <<"The TTree TreeS needed to set by region not found."
161 " No region of interest cut will be applied."<< endl;
165 cout << "calling SetByReionOfInterest ts="<< ts <<endl;
166 SetByRegionOfInterest(ts);
171 //______________________________________________________________________
172 void AliITSDigitizer::Exec(Option_t* opt){
173 // Main digitization function.
175 // Option_t * opt list of sub detector to digitize. =0 all.
181 char name[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
183 const char *det[3] = {strstr(opt,"SPD"),strstr(opt,"SDD"),
185 if( !det[0] && !det[1] && !det[2] ) all = "All";
187 AliITSsimulation *sim = 0;
188 AliITSDetType *iDetType = 0;
189 static Bool_t setDef = kTRUE;
192 Error("Exec","Init not succesfull, aborting.");
196 if( setDef ) fITS->SetDefaultSimulation();
198 sprintf(name,"%s",fITS->GetName());
200 Int_t nfiles = GetManager()->GetNinputs();
201 Int_t event = GetManager()->GetOutputEventNr();
202 Int_t size = fITS->GetITSgeom()->GetIndexMax();
203 Int_t module,id,ifiles,mask;
205 Int_t *fl = new Int_t[nfiles];
208 for(id=0;id<nfiles;id++) if(id!=fRoiifile){
209 // just in case fRoiifile!=0.
213 TClonesArray * sdig = new TClonesArray( "AliITSpListItem",1000 );
216 fITS->MakeBranchInTreeD(GetManager()->GetTreeD());
218 for(module=0; module<size; module++ ){
219 if(fActive && fRoif!=0) if(!fActive[module]) continue;
220 id = fITS->GetITSgeom()->GetModuleType(module);
221 if(!all && !det[id]) continue;
222 iDetType = fITS->DetType( id );
223 sim = (AliITSsimulation*)iDetType->GetSimulationModel();
225 Error( "Exec", "The simulation class was not instanciated!" );
229 // Fill the module with the sum of SDigits
230 sim->InitSimulationModule(module, event);
231 //cout << "Module=" << module;
232 for(ifiles=0; ifiles<nfiles; ifiles++ ){
233 if(fActive && fRoif!=0) if(!fActive[module]) continue;
234 //cout <<" fl[ifiles=" << ifiles << "]=" << fl[ifiles];
235 TTree *treeS = GetManager()->GetInputTreeS(fl[ifiles]);
236 if( !(treeS && fITS->GetSDigits()) ) continue;
237 TBranch *brchSDigits = treeS->GetBranch( name );
239 brchSDigits->SetAddress( &sdig );
241 Error( "Exec", "branch ITS not found in TreeS, input file %d ",
244 } // end if brchSDigits
246 mask = GetManager()->GetMask(ifiles);
247 // add summable digits to module
248 brchSDigits->GetEvent( module );
249 lmod = sim->AddSDigitsToModule(sdig,mask);
251 fActive[module] = lmod;
253 //cout << " fActive["<<module<<"]=";
254 //if(fActive[module]) cout << "kTRUE";
255 //else cout << "kFALSE";
257 //cout << " end ifiles loop" << endl;
258 // Digitize current module sum(SDigits)->Digits
259 sim->FinishSDigitiseModule();
261 // fills all branches - wasted disk space
262 GetManager()->GetTreeD()->Fill();
265 //cout << "end modules loop"<<endl;
267 GetManager()->GetTreeD()->AutoSave();
272 for(Int_t i=0;i<fITS->GetITSgeom()->GetIndexMax();i++) fActive[i] = kTRUE;
275 //______________________________________________________________________
276 void AliITSDigitizer::SetByRegionOfInterest(TTree *ts){
277 // Scans through the ITS branch of the SDigits tree, ts, for modules
278 // which have SDigits in them. For these modules, a flag is set to
279 // digitize only these modules. The value of fRoif determines how many
280 // neighboring modules will also be turned on. fRoif=0 will turn on only
281 // those modules with SDigits in them. fRoif=1 will turn on, in addition,
282 // those modules that are +-1 module from the one with the SDigits. And
283 // So on. This last feature is not supported yet.
285 // TTree *ts The tree in which the existing SDigits will define the
286 // region of interest.
295 TBranch *brchSDigits = ts->GetBranch(fITS->GetName());
296 TClonesArray * sdig = new TClonesArray( "AliITSpListItem",1000 );
297 //cout << "Region of Interest ts="<<ts<<" brchSDigits="<<brchSDigits<<" sdig="<<sdig<<endl;
300 brchSDigits->SetAddress( &sdig );
302 Error( "SetByRegionOfInterest","branch ITS not found in TreeS");
304 } // end if brchSDigits
306 nm = fITS->GetITSgeom()->GetIndexMax();
308 //cout << " fActive["<<m<<"]=";
309 fActive[m] = kFALSE; // Not active by default
311 brchSDigits->GetEvent(m);
312 if(sdig->GetLast()>=0) for(i=0;i<sdig->GetLast();i++){
313 // activate the necessary modules
314 if(((AliITSpList*)sdig->At(m))->GetpListItem(i)->GetSignal()>0.0){ // Must have non zero signal.
318 } // end if. end for i.
319 //cout << fActive[m];