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 **************************************************************************/
19 Class for creating of the sumable digits and digits from MC data
21 The input : ideal signals (Hits->Diffusion->Attachment -Ideal signal)
22 The output: raw digits
25 1. Pad by pad gain map
27 3. The dead channels identified - zerro noise for corresponding pads
28 In this case the outpu equal zerro
37 #include <TObjArray.h>
39 #include <TDirectory.h>
40 #include <Riostream.h>
42 #include "AliTPCDigitizer.h"
45 #include "AliTPCParam.h"
46 #include "AliTPCParamSR.h"
49 #include "AliRunDigitizer.h"
50 #include "AliSimDigits.h"
53 #include "AliTPCcalibDB.h"
54 #include "AliTPCCalPad.h"
55 #include "AliTPCCalROC.h"
57 ClassImp(AliTPCDigitizer)
59 //___________________________________________
60 AliTPCDigitizer::AliTPCDigitizer() :AliDigitizer(),fDebug(0)
63 // Default ctor - don't use it
68 //___________________________________________
69 AliTPCDigitizer::AliTPCDigitizer(AliRunDigitizer* manager)
70 :AliDigitizer(manager),fDebug(0)
73 // ctor which should be used
75 AliDebug(2,"(AliRunDigitizer* manager) was processed");
78 //------------------------------------------------------------------------
79 AliTPCDigitizer::~AliTPCDigitizer()
86 //------------------------------------------------------------------------
87 Bool_t AliTPCDigitizer::Init()
95 //------------------------------------------------------------------------
96 void AliTPCDigitizer::Exec(Option_t* option)
100 //------------------------------------------------------------------------
101 void AliTPCDigitizer::ExecFast(Option_t* option)
104 // merge input tree's with summable digits
105 //output stored in TreeTPCD
108 TString optionString = option;
109 if (optionString.Data() == "deb") {
110 cout<<"AliTPCDigitizer::Exec: called with option deb "<<endl;
113 //get detector and geometry
116 AliRunLoader *rl, *orl;
117 AliLoader *gime, *ogime;
121 Warning("ExecFast","gAlice is NULL. Loading from input 0");
122 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
125 Error("ExecFast","Can not find Run Loader for input 0. Can not proceed.");
131 AliTPC *pTPC = (AliTPC *) gAlice->GetModule("TPC");
132 AliTPCParam * param = pTPC->GetParam();
134 sprintf(s,param->GetTitle());
135 sprintf(ss,"75x40_100x60");
137 printf("2 pad-length geom hits with 3 pad-lenght geom digits...\n");
139 param=new AliTPCParamSR();
142 sprintf(ss,"75x40_100x60_150x60");
143 if(strcmp(s,ss)!=0) {
144 printf("No TPC parameters found...\n");
149 pTPC->GenerNoise(500000); //create teble with noise
151 Int_t nInputs = fManager->GetNinputs();
152 Int_t * masks = new Int_t[nInputs];
153 for (Int_t i=0; i<nInputs;i++)
154 masks[i]= fManager->GetMask(i);
155 Short_t **pdig= new Short_t*[nInputs]; //pointers to the expanded digits array
156 Int_t **ptr= new Int_t*[nInputs]; //pointers to teh expanded tracks array
157 Bool_t *active= new Bool_t[nInputs]; //flag for active input segments
160 //create digits array for given sectors
163 AliSimDigits ** digarr = new AliSimDigits*[nInputs];
164 for (Int_t i1=0;i1<nInputs; i1++)
168 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i1));
169 gime = rl->GetLoader("TPCLoader");
170 gime->LoadSDigits("read");
171 TTree * treear = gime->TreeS();
175 cerr<<"AliTPCDigitizer: Input tree with SDigits not found in"
176 <<" input "<< i1<<endl;
180 if (treear->GetIndex()==0)
181 treear->BuildIndex("fSegmentID","fSegmentID");
182 treear->GetBranch("Segment")->SetAddress(&digarr[i1]);
186 //create branch's in TPC treeD
187 AliSimDigits * digrow = new AliSimDigits;
189 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
190 ogime = orl->GetLoader("TPCLoader");
192 TTree * tree = ogime->TreeD();
195 ogime->MakeTree("D");
196 tree = ogime->TreeD();
198 tree->Branch("Segment","AliSimDigits",&digrow);
201 param->SetZeroSup(2);
203 Int_t zerosup = param->GetZeroSup();
204 AliTPCCalPad * gainTPC = AliTPCcalibDB::Instance()->GetPadGainFactor();
205 AliTPCCalPad * noiseTPC = AliTPCcalibDB::Instance()->GetPadNoise();
207 //Loop over segments of the TPC
209 for (Int_t segmentID=0; segmentID<param->GetNRowsTotal(); segmentID++)
212 if (!param->AdjustSectorRow(segmentID,sec,row))
214 cerr<<"AliTPC warning: invalid segment ID ! "<<segmentID<<endl;
217 AliTPCCalROC * gainROC = gainTPC->GetCalROC(sec); // pad gains per given sector
218 AliTPCCalROC * noiseROC = noiseTPC->GetCalROC(sec); // noise per given sector
219 digrow->SetID(segmentID);
224 Bool_t digitize = kFALSE;
225 for (Int_t i=0;i<nInputs; i++)
228 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
229 gime = rl->GetLoader("TPCLoader");
231 if (gime->TreeS()->GetEntryWithIndex(segmentID,segmentID) >= 0) {
232 digarr[i]->ExpandBuffer();
233 digarr[i]->ExpandTrackBuffer();
234 nrows = digarr[i]->GetNRows();
235 ncols = digarr[i]->GetNCols();
237 if (!fRegionOfInterest || (i == 0)) digitize = kTRUE;
241 if (fRegionOfInterest && !digitize) break;
243 if (!digitize) continue;
245 digrow->Allocate(nrows,ncols);
246 digrow->AllocateTrack(3);
249 Int_t label[1000]; //stack for 300 events
252 Int_t nElems = nrows*ncols;
254 for (Int_t i=0;i<nInputs; i++)
256 pdig[i] = digarr[i]->GetDigits();
257 ptr[i] = digarr[i]->GetTracks();
260 Short_t *pdig1= digrow->GetDigits();
261 Int_t *ptr1= digrow->GetTracks() ;
265 for (Int_t elem=0;elem<nElems; elem++)
271 for (Int_t i=0;i<nInputs; i++) if (active[i])
273 // q += digarr[i]->GetDigitFast(rows,col);
276 for (Int_t tr=0;tr<3;tr++)
278 // Int_t lab = digarr[i]->GetTrackIDFast(rows,col,tr);
279 Int_t lab = ptr[i][tr*nElems];
280 if ( (lab > 1) && *(pdig[i])>zerosup)
282 label[labptr]=lab+masks[i];
289 q/=16.; //conversion factor
290 Float_t gain = gainROC->GetValue(row,elem/nrows); // get gain for given - pad-row pad
295 Float_t noisePad = noiseROC->GetValue(row,elem/nrows);
296 // Float_t noise = gRandom->Gaus(0,param->GetNoise()*param->GetNoiseNormFac());
297 Float_t noise = pTPC->GetNoise();
299 if (noisePad<0.001) q=0; // dead channels identified - 0 noise
303 if(q >= param->GetADCSat()) q = (Short_t)(param->GetADCSat() - 1);
304 //digrow->SetDigitFast((Short_t)q,rows,col);
306 for (Int_t tr=0;tr<3;tr++)
309 ptr1[tr*nElems] = label[tr];
316 digrow->CompresBuffer(1,zerosup);
317 digrow->CompresTrackBuffer(1);
319 if (fDebug>0) cerr<<sec<<"\t"<<row<<"\n";
320 } //for (Int_t n=0; n<param->GetNRowsTotal(); n++)
323 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
324 ogime = orl->GetLoader("TPCLoader");
325 ogime->WriteDigits("OVERWRITE");
327 //fManager->GetTreeDTPC()->Write(0,TObject::kOverwrite);
330 for (Int_t i1=0;i1<nInputs; i1++) delete digarr[i1];
340 //------------------------------------------------------------------------
341 void AliTPCDigitizer::ExecSave(Option_t* option)
344 // merge input tree's with summable digits
345 //output stored in TreeTPCD
347 TString optionString = option;
348 if (optionString.Data() == "deb") {
349 cout<<"AliTPCDigitizer::Exec: called with option deb "<<endl;
352 //get detector and geometry
353 AliRunLoader *rl, *orl;
354 AliLoader *gime, *ogime;
357 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
358 ogime = orl->GetLoader("TPCLoader");
360 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
361 gime = rl->GetLoader("TPCLoader");
364 AliRun* alirun = rl->GetAliRun();
366 AliTPC *pTPC = (AliTPC *) alirun->GetModule("TPC");
367 AliTPCParam * param = pTPC->GetParam();
368 pTPC->GenerNoise(500000); //create teble with noise
369 printf("noise %f \n", param->GetNoise()*param->GetNoiseNormFac());
371 Int_t nInputs = fManager->GetNinputs();
372 Int_t * masks = new Int_t[nInputs];
373 for (Int_t i=0; i<nInputs;i++)
374 masks[i]= fManager->GetMask(i);
376 AliSimDigits ** digarr = new AliSimDigits*[nInputs];
377 for (Int_t i1=0;i1<nInputs; i1++)
381 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i1));
382 gime = rl->GetLoader("TPCLoader");
384 TTree * treear = gime->TreeS();
385 TBranch * br = treear->GetBranch("fSegmentID");
386 if (br) br->GetFile()->cd();
388 cerr<<" TPC - not existing input = \n"<<i1<<" ";
390 treear->GetBranch("Segment")->SetAddress(&digarr[i1]);
393 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
394 gime = rl->GetLoader("TPCLoader");
395 Stat_t nentries = gime->TreeS()->GetEntries();
398 //create branch's in TPC treeD
399 AliSimDigits * digrow = new AliSimDigits;
400 TTree * tree = ogime->TreeD();
402 tree->Branch("Segment","AliSimDigits",&digrow);
403 param->SetZeroSup(2);
405 Int_t zerosup = param->GetZeroSup();
406 //Loop over segments of the TPC
408 AliTPCCalPad * gainTPC = AliTPCcalibDB::Instance()->GetPadGainFactor();
409 AliTPCCalPad * noiseTPC = AliTPCcalibDB::Instance()->GetPadNoise();
410 for (Int_t n=0; n<nentries; n++) {
411 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
412 gime = rl->GetLoader("TPCLoader");
413 gime->TreeS()->GetEvent(n);
415 digarr[0]->ExpandBuffer();
416 digarr[0]->ExpandTrackBuffer();
419 for (Int_t i=1;i<nInputs; i++){
420 // fManager->GetInputTreeTPCS(i)->GetEntryWithIndex(digarr[0]->GetID(),digarr[0]->GetID());
421 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
422 gime = rl->GetLoader("TPCLoader");
423 gime->TreeS()->GetEntryWithIndex(digarr[0]->GetID(),digarr[0]->GetID());
424 digarr[i]->ExpandBuffer();
425 digarr[i]->ExpandTrackBuffer();
426 if ((digarr[0]->GetID()-digarr[i]->GetID())>0)
432 if (!param->AdjustSectorRow(digarr[0]->GetID(),sec,row)) {
433 cerr<<"AliTPC warning: invalid segment ID ! "<<digarr[0]->GetID()<<endl;
437 AliTPCCalROC * gainROC = gainTPC->GetCalROC(sec); // pad gains per given sector
438 AliTPCCalROC * noiseROC = noiseTPC->GetCalROC(sec); // noise per given sector
439 digrow->SetID(digarr[0]->GetID());
441 Int_t nrows = digarr[0]->GetNRows();
442 Int_t ncols = digarr[0]->GetNCols();
443 digrow->Allocate(nrows,ncols);
444 digrow->AllocateTrack(3);
447 Int_t label[1000]; //stack for 300 events
452 for (Int_t rows=0;rows<nrows; rows++){
453 for (Int_t col=0;col<ncols; col++){
458 for (Int_t i=0;i<nInputs; i++){
459 q += digarr[i]->GetDigitFast(rows,col);
462 for (Int_t tr=0;tr<3;tr++) {
463 Int_t lab = digarr[i]->GetTrackIDFast(rows,col,tr);
464 //Int_t lab = ptr[i][tr*nElems];
466 label[labptr]=lab+masks[i];
474 q/=16.; //conversion factor
475 // Float_t noise = gRandom->Gaus(0,param->GetNoise()*param->GetNoiseNormFac());
476 Float_t gain = gainROC->GetValue(row,col);
478 Float_t noisePad = noiseROC->GetValue(row, col);
480 Float_t noise = pTPC->GetNoise();
482 if (noisePad<0.00001) q=0; // dead channels identified - 0 noise
487 if(q >= param->GetADCSat()) q = (Short_t)(param->GetADCSat() - 1);
488 digrow->SetDigitFast((Short_t)q,rows,col);
489 // *pdig1 =Short_t(q);
490 for (Int_t tr=0;tr<3;tr++){
492 ((AliSimDigits*)digrow)->SetTrackIDFast(label[tr],rows,col,tr);
493 //ptr1[tr*nElems] = label[tr];
495 // ((AliSimDigits*)digrow)->SetTrackIDFast(-1,rows,col,tr);
496 // ptr1[tr*nElems] = 1;
504 digrow->CompresBuffer(1,zerosup);
505 digrow->CompresTrackBuffer(1);
507 if (fDebug>0) cerr<<sec<<"\t"<<row<<"\n";
509 // printf("end TPC merging - end -Tree %s\t%p\n",fManager->GetInputTreeH(0)->GetName(),fManager->GetInputTreeH(0)->GetListOfBranches()->At(3));
510 //fManager->GetTreeDTPC()->Write(0,TObject::kOverwrite);
511 ogime->WriteDigits("OVERWRITE");
513 for (Int_t i=1;i<nInputs; i++)
515 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
516 gime = rl->GetLoader("TPCLoader");
517 gime->UnloadSDigits();
519 ogime->UnloadDigits();
522 for (Int_t i1=0;i1<nInputs; i1++) delete digarr[i1];