1 /**************************************************************************
2 * Copyright(c) 1998-2000, 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 **************************************************************************/
20 #include <TObjArray.h>
22 #include <TDirectory.h>
23 #include <Riostream.h>
25 #include "AliTPCDigitizer.h"
28 #include "AliTPCParam.h"
29 #include "AliTPCParamSR.h"
32 #include "AliRunDigitizer.h"
33 #include "AliSimDigits.h"
36 ClassImp(AliTPCDigitizer)
38 //___________________________________________
39 AliTPCDigitizer::AliTPCDigitizer() :AliDigitizer()
41 // Default ctor - don't use it
45 //___________________________________________
46 AliTPCDigitizer::AliTPCDigitizer(AliRunDigitizer* manager)
47 :AliDigitizer(manager)
49 // ctor which should be used
52 cerr<<"AliTPCDigitizer::AliTPCDigitizer"
53 <<"(AliRunDigitizer* manager) was processed"<<endl;
56 //------------------------------------------------------------------------
57 AliTPCDigitizer::~AliTPCDigitizer()
64 //------------------------------------------------------------------------
65 Bool_t AliTPCDigitizer::Init()
73 //------------------------------------------------------------------------
74 void AliTPCDigitizer::Exec(Option_t* option)
78 //------------------------------------------------------------------------
79 void AliTPCDigitizer::ExecFast(Option_t* option)
82 // merge input tree's with summable digits
83 //output stored in TreeTPCD
86 TString optionString = option;
87 if (optionString.Data() == "deb") {
88 cout<<"AliTPCDigitizer::Exec: called with option deb "<<endl;
91 //get detector and geometry
94 AliRunLoader *rl, *orl;
95 AliLoader *gime, *ogime;
99 Warning("ExecFast","gAlice is NULL. Loading from input 0");
100 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
103 Error("ExecFast","Can not find Run Loader for input 0. Can not proceed.");
109 AliTPC *pTPC = (AliTPC *) gAlice->GetModule("TPC");
110 AliTPCParam * param = pTPC->GetParam();
112 sprintf(s,param->GetTitle());
113 sprintf(ss,"75x40_100x60");
115 printf("2 pad-length geom hits with 3 pad-lenght geom digits...\n");
117 param=new AliTPCParamSR();
120 sprintf(ss,"75x40_100x60_150x60");
121 if(strcmp(s,ss)!=0) {
122 printf("No TPC parameters found...\n");
127 pTPC->GenerNoise(500000); //create teble with noise
129 Int_t nInputs = fManager->GetNinputs();
130 Int_t * masks = new Int_t[nInputs];
131 for (Int_t i=0; i<nInputs;i++)
132 masks[i]= fManager->GetMask(i);
133 Short_t **pdig= new Short_t*[nInputs]; //pointers to the expanded digits array
134 Int_t **ptr= new Int_t*[nInputs]; //pointers to teh expanded tracks array
135 Bool_t *active= new Bool_t[nInputs]; //flag for active input segments
138 //create digits array for given sectors
141 AliSimDigits ** digarr = new AliSimDigits*[nInputs];
142 for (Int_t i1=0;i1<nInputs; i1++)
146 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i1));
147 gime = rl->GetLoader("TPCLoader");
148 gime->LoadSDigits("read");
149 TTree * treear = gime->TreeS();
153 cerr<<"AliTPCDigitizer: Input tree with SDigits not found in"
154 <<" input "<< i1<<endl;
158 if (treear->GetIndex()==0)
159 treear->BuildIndex("fSegmentID","fSegmentID");
160 treear->GetBranch("Segment")->SetAddress(&digarr[i1]);
164 //create branch's in TPC treeD
165 AliSimDigits * digrow = new AliSimDigits;
167 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
168 ogime = orl->GetLoader("TPCLoader");
170 TTree * tree = ogime->TreeD();
173 ogime->MakeTree("D");
174 tree = ogime->TreeD();
176 tree->Branch("Segment","AliSimDigits",&digrow);
179 param->SetZeroSup(2);
181 Int_t zerosup = param->GetZeroSup();
183 //Loop over segments of the TPC
185 for (Int_t segmentID=0; segmentID<param->GetNRowsTotal(); segmentID++)
188 if (!param->AdjustSectorRow(segmentID,sec,row))
190 cerr<<"AliTPC warning: invalid segment ID ! "<<segmentID<<endl;
194 digrow->SetID(segmentID);
199 Bool_t digitize = kFALSE;
200 for (Int_t i=0;i<nInputs; i++)
203 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
204 gime = rl->GetLoader("TPCLoader");
206 if (gime->TreeS()->GetEntryWithIndex(segmentID,segmentID) >= 0) {
207 digarr[i]->ExpandBuffer();
208 digarr[i]->ExpandTrackBuffer();
209 nrows = digarr[i]->GetNRows();
210 ncols = digarr[i]->GetNCols();
212 if (!fRegionOfInterest || (i == 0)) digitize = kTRUE;
216 if (fRegionOfInterest && !digitize) break;
218 if (!digitize) continue;
220 digrow->Allocate(nrows,ncols);
221 digrow->AllocateTrack(3);
224 Int_t label[1000]; //stack for 300 events
227 Int_t nElems = nrows*ncols;
229 for (Int_t i=0;i<nInputs; i++)
231 pdig[i] = digarr[i]->GetDigits();
232 ptr[i] = digarr[i]->GetTracks();
235 Short_t *pdig1= digrow->GetDigits();
236 Int_t *ptr1= digrow->GetTracks() ;
240 for (Int_t elem=0;elem<nElems; elem++)
246 for (Int_t i=0;i<nInputs; i++) if (active[i])
248 // q += digarr[i]->GetDigitFast(rows,col);
251 for (Int_t tr=0;tr<3;tr++)
253 // Int_t lab = digarr[i]->GetTrackIDFast(rows,col,tr);
254 Int_t lab = ptr[i][tr*nElems];
255 if ( (lab > 1) && *(pdig[i])>zerosup)
257 label[labptr]=lab+masks[i];
264 q/=16.; //conversion factor
265 // Float_t noise = gRandom->Gaus(0,param->GetNoise()*param->GetNoiseNormFac());
266 Float_t noise = pTPC->GetNoise();
271 if(q > param->GetADCSat()) q = (Short_t)(param->GetADCSat());
272 //digrow->SetDigitFast((Short_t)q,rows,col);
274 for (Int_t tr=0;tr<3;tr++)
277 ptr1[tr*nElems] = label[tr];
284 digrow->CompresBuffer(1,zerosup);
285 digrow->CompresTrackBuffer(1);
287 if (fDebug>0) cerr<<sec<<"\t"<<row<<"\n";
288 } //for (Int_t n=0; n<param->GetNRowsTotal(); n++)
291 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
292 ogime = orl->GetLoader("TPCLoader");
293 ogime->WriteDigits("OVERWRITE");
295 //fManager->GetTreeDTPC()->Write(0,TObject::kOverwrite);
298 for (Int_t i1=0;i1<nInputs; i1++) delete digarr[i1];
308 //------------------------------------------------------------------------
309 void AliTPCDigitizer::ExecSave(Option_t* option)
312 // merge input tree's with summable digits
313 //output stored in TreeTPCD
315 TString optionString = option;
316 if (optionString.Data() == "deb") {
317 cout<<"AliTPCDigitizer::Exec: called with option deb "<<endl;
320 //get detector and geometry
321 AliRunLoader *rl, *orl;
322 AliLoader *gime, *ogime;
325 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
326 ogime = orl->GetLoader("TPCLoader");
328 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
329 gime = rl->GetLoader("TPCLoader");
332 AliRun* alirun = rl->GetAliRun();
334 AliTPC *pTPC = (AliTPC *) alirun->GetModule("TPC");
335 AliTPCParam * param = pTPC->GetParam();
336 pTPC->GenerNoise(500000); //create teble with noise
337 printf("noise %f \n", param->GetNoise()*param->GetNoiseNormFac());
339 Int_t nInputs = fManager->GetNinputs();
340 Int_t * masks = new Int_t[nInputs];
341 for (Int_t i=0; i<nInputs;i++)
342 masks[i]= fManager->GetMask(i);
344 AliSimDigits ** digarr = new AliSimDigits*[nInputs];
345 for (Int_t i1=0;i1<nInputs; i1++)
349 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i1));
350 gime = rl->GetLoader("TPCLoader");
352 TTree * treear = gime->TreeS();
353 TBranch * br = treear->GetBranch("fSegmentID");
354 if (br) br->GetFile()->cd();
356 cerr<<" TPC - not existing input = \n"<<i1<<" ";
358 treear->GetBranch("Segment")->SetAddress(&digarr[i1]);
361 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
362 gime = rl->GetLoader("TPCLoader");
363 Stat_t nentries = gime->TreeS()->GetEntries();
366 //create branch's in TPC treeD
367 AliSimDigits * digrow = new AliSimDigits;
368 TTree * tree = ogime->TreeD();
370 tree->Branch("Segment","AliSimDigits",&digrow);
371 param->SetZeroSup(2);
373 Int_t zerosup = param->GetZeroSup();
374 //Loop over segments of the TPC
376 for (Int_t n=0; n<nentries; n++) {
377 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
378 gime = rl->GetLoader("TPCLoader");
379 gime->TreeS()->GetEvent(n);
381 digarr[0]->ExpandBuffer();
382 digarr[0]->ExpandTrackBuffer();
384 for (Int_t i=1;i<nInputs; i++){
385 // fManager->GetInputTreeTPCS(i)->GetEntryWithIndex(digarr[0]->GetID(),digarr[0]->GetID());
386 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
387 gime = rl->GetLoader("TPCLoader");
388 gime->TreeS()->GetEntryWithIndex(digarr[0]->GetID(),digarr[0]->GetID());
389 digarr[i]->ExpandBuffer();
390 digarr[i]->ExpandTrackBuffer();
391 if ((digarr[0]->GetID()-digarr[i]->GetID())>0)
397 if (!param->AdjustSectorRow(digarr[0]->GetID(),sec,row)) {
398 cerr<<"AliTPC warning: invalid segment ID ! "<<digarr[0]->GetID()<<endl;
402 digrow->SetID(digarr[0]->GetID());
404 Int_t nrows = digarr[0]->GetNRows();
405 Int_t ncols = digarr[0]->GetNCols();
406 digrow->Allocate(nrows,ncols);
407 digrow->AllocateTrack(3);
410 Int_t label[1000]; //stack for 300 events
415 for (Int_t rows=0;rows<nrows; rows++){
416 for (Int_t col=0;col<ncols; col++){
421 for (Int_t i=0;i<nInputs; i++){
422 q += digarr[i]->GetDigitFast(rows,col);
425 for (Int_t tr=0;tr<3;tr++) {
426 Int_t lab = digarr[i]->GetTrackIDFast(rows,col,tr);
427 //Int_t lab = ptr[i][tr*nElems];
429 label[labptr]=lab+masks[i];
437 q/=16.; //conversion factor
438 // Float_t noise = gRandom->Gaus(0,param->GetNoise()*param->GetNoiseNormFac());
439 Float_t noise = pTPC->GetNoise();
444 if(q > param->GetADCSat()) q = (Short_t)(param->GetADCSat());
445 digrow->SetDigitFast((Short_t)q,rows,col);
446 // *pdig1 =Short_t(q);
447 for (Int_t tr=0;tr<3;tr++){
449 ((AliSimDigits*)digrow)->SetTrackIDFast(label[tr],rows,col,tr);
450 //ptr1[tr*nElems] = label[tr];
452 // ((AliSimDigits*)digrow)->SetTrackIDFast(-1,rows,col,tr);
453 // ptr1[tr*nElems] = 1;
461 digrow->CompresBuffer(1,zerosup);
462 digrow->CompresTrackBuffer(1);
464 if (fDebug>0) cerr<<sec<<"\t"<<row<<"\n";
466 // printf("end TPC merging - end -Tree %s\t%p\n",fManager->GetInputTreeH(0)->GetName(),fManager->GetInputTreeH(0)->GetListOfBranches()->At(3));
467 //fManager->GetTreeDTPC()->Write(0,TObject::kOverwrite);
468 ogime->WriteDigits("OVERWRITE");
470 for (Int_t i=1;i<nInputs; i++)
472 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
473 gime = rl->GetLoader("TPCLoader");
474 gime->UnloadSDigits();
476 ogime->UnloadDigits();
479 for (Int_t i1=0;i1<nInputs; i1++) delete digarr[i1];