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>
41 #include <TParameter.h>
43 #include "AliTPCDigitizer.h"
46 #include "AliTPCParam.h"
47 #include "AliTPCParamSR.h"
50 #include "AliRunDigitizer.h"
51 #include "AliSimDigits.h"
54 #include "AliTPCcalibDB.h"
55 #include "AliTPCCalPad.h"
56 #include "AliTPCCalROC.h"
58 ClassImp(AliTPCDigitizer)
60 //___________________________________________
61 AliTPCDigitizer::AliTPCDigitizer() :AliDigitizer(),fDebug(0)
64 // Default ctor - don't use it
69 //___________________________________________
70 AliTPCDigitizer::AliTPCDigitizer(AliRunDigitizer* manager)
71 :AliDigitizer(manager),fDebug(0)
74 // ctor which should be used
76 AliDebug(2,"(AliRunDigitizer* manager) was processed");
79 //------------------------------------------------------------------------
80 AliTPCDigitizer::~AliTPCDigitizer()
87 //------------------------------------------------------------------------
88 Bool_t AliTPCDigitizer::Init()
96 //------------------------------------------------------------------------
97 void AliTPCDigitizer::Exec(Option_t* option)
101 //------------------------------------------------------------------------
102 void AliTPCDigitizer::ExecFast(Option_t* option)
105 // merge input tree's with summable digits
106 //output stored in TreeTPCD
109 TString optionString = option;
110 if (!strcmp(optionString.Data(),"deb")) {
111 cout<<"AliTPCDigitizer::Exec: called with option deb "<<endl;
114 //get detector and geometry
117 AliRunLoader *rl, *orl;
118 AliLoader *gime, *ogime;
122 Warning("ExecFast","gAlice is NULL. Loading from input 0");
123 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
126 Error("ExecFast","Can not find Run Loader for input 0. Can not proceed.");
132 AliTPC *pTPC = (AliTPC *) gAlice->GetModule("TPC");
133 AliTPCParam * param = pTPC->GetParam();
135 sprintf(s,param->GetTitle());
136 sprintf(ss,"75x40_100x60");
138 printf("2 pad-length geom hits with 3 pad-lenght geom digits...\n");
140 param=new AliTPCParamSR();
143 sprintf(ss,"75x40_100x60_150x60");
144 if(strcmp(s,ss)!=0) {
145 printf("No TPC parameters found...\n");
150 pTPC->GenerNoise(500000); //create table with noise
152 Int_t nInputs = fManager->GetNinputs();
153 Int_t * masks = new Int_t[nInputs];
154 for (Int_t i=0; i<nInputs;i++)
155 masks[i]= fManager->GetMask(i);
156 Short_t **pdig= new Short_t*[nInputs]; //pointers to the expanded digits array
157 Int_t **ptr= new Int_t*[nInputs]; //pointers to the expanded tracks array
158 Bool_t *active= new Bool_t[nInputs]; //flag for active input segments
161 //create digits array for given sectors
164 //create branch's in TPC treeD
165 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
166 ogime = orl->GetLoader("TPCLoader");
167 TTree * tree = ogime->TreeD();
168 AliSimDigits * digrow = new AliSimDigits;
172 ogime->MakeTree("D");
173 tree = ogime->TreeD();
175 tree->Branch("Segment","AliSimDigits",&digrow);
177 AliSimDigits ** digarr = new AliSimDigits*[nInputs];
178 for (Int_t i1=0;i1<nInputs; i1++)
182 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i1));
183 gime = rl->GetLoader("TPCLoader");
184 gime->LoadSDigits("read");
185 TTree * treear = gime->TreeS();
189 cerr<<"AliTPCDigitizer: Input tree with SDigits not found in"
190 <<" input "<< i1<<endl;
191 for (Int_t i2=0;i2<i1+1; i2++){
193 if(digarr[i2]) delete digarr[i2];
203 sprintf(phname,"lhcphase%d",i1);
204 TParameter<float> *ph = (TParameter<float>*)treear->GetUserInfo()
205 ->FindObject("lhcphase0");
207 cerr<<"AliTPCDigitizer: LHC phase not found in"
208 <<" input "<< i1<<endl;
209 for (Int_t i2=0;i2<i1+1; i2++){
210 if(digarr[i2]) delete digarr[i2];
219 tree->GetUserInfo()->Add(new TParameter<float>(phname,ph->GetVal()));
221 if (treear->GetIndex()==0)
222 treear->BuildIndex("fSegmentID","fSegmentID");
223 treear->GetBranch("Segment")->SetAddress(&digarr[i1]);
231 param->SetZeroSup(2);
233 Int_t zerosup = param->GetZeroSup();
234 AliTPCCalPad * gainTPC = AliTPCcalibDB::Instance()->GetDedxGainFactor();
235 AliTPCCalPad * noiseTPC = AliTPCcalibDB::Instance()->GetPadNoise();
237 //Loop over segments of the TPC
239 for (Int_t segmentID=0; segmentID<param->GetNRowsTotal(); segmentID++)
242 if (!param->AdjustSectorRow(segmentID,sec,row))
244 cerr<<"AliTPC warning: invalid segment ID ! "<<segmentID<<endl;
247 AliTPCCalROC * gainROC = gainTPC->GetCalROC(sec); // pad gains per given sector
248 AliTPCCalROC * noiseROC = noiseTPC->GetCalROC(sec); // noise per given sector
249 digrow->SetID(segmentID);
254 Bool_t digitize = kFALSE;
255 for (Int_t i=0;i<nInputs; i++)
258 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
259 gime = rl->GetLoader("TPCLoader");
261 if (gime->TreeS()->GetEntryWithIndex(segmentID,segmentID) >= 0) {
262 digarr[i]->ExpandBuffer();
263 digarr[i]->ExpandTrackBuffer();
264 nrows = digarr[i]->GetNRows();
265 ncols = digarr[i]->GetNCols();
267 if (!fRegionOfInterest || (i == 0)) digitize = kTRUE;
271 if (fRegionOfInterest && !digitize) break;
273 if (!digitize) continue;
275 digrow->Allocate(nrows,ncols);
276 digrow->AllocateTrack(3);
279 Int_t label[1000]; //stack for 300 events
282 Int_t nElems = nrows*ncols;
284 for (Int_t i=0;i<nInputs; i++)
286 pdig[i] = digarr[i]->GetDigits();
287 ptr[i] = digarr[i]->GetTracks();
290 Short_t *pdig1= digrow->GetDigits();
291 Int_t *ptr1= digrow->GetTracks() ;
295 for (Int_t elem=0;elem<nElems; elem++)
301 for (Int_t i=0;i<nInputs; i++) if (active[i])
303 // q += digarr[i]->GetDigitFast(rows,col);
306 for (Int_t tr=0;tr<3;tr++)
308 // Int_t lab = digarr[i]->GetTrackIDFast(rows,col,tr);
309 Int_t lab = ptr[i][tr*nElems];
310 if ( (lab > 1) && *(pdig[i])>zerosup)
312 label[labptr]=lab+masks[i];
319 q/=16.; //conversion factor
320 Float_t gain = gainROC->GetValue(row,elem/nrows); // get gain for given - pad-row pad
322 //printf("problem\n");
325 Float_t noisePad = noiseROC->GetValue(row,elem/nrows);
326 // Float_t noise = gRandom->Gaus(0,param->GetNoise()*param->GetNoiseNormFac());
327 Float_t noise = pTPC->GetNoise();
332 if(q >= param->GetADCSat()) q = (Short_t)(param->GetADCSat() - 1);
333 //digrow->SetDigitFast((Short_t)q,rows,col);
335 for (Int_t tr=0;tr<3;tr++)
338 ptr1[tr*nElems] = label[tr];
347 digrow->GlitchFilter();
349 digrow->CompresBuffer(1,zerosup);
350 digrow->CompresTrackBuffer(1);
352 if (fDebug>0) cerr<<sec<<"\t"<<row<<"\n";
353 } //for (Int_t n=0; n<param->GetNRowsTotal(); n++)
356 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
357 ogime = orl->GetLoader("TPCLoader");
358 ogime->WriteDigits("OVERWRITE");
360 //fManager->GetTreeDTPC()->Write(0,TObject::kOverwrite);
363 for (Int_t i1=0;i1<nInputs; i1++) delete digarr[i1];
373 //------------------------------------------------------------------------
374 void AliTPCDigitizer::ExecSave(Option_t* option)
377 // merge input tree's with summable digits
378 //output stored in TreeTPCD
380 TString optionString = option;
381 if (!strcmp(optionString.Data(),"deb")) {
382 cout<<"AliTPCDigitizer::Exec: called with option deb "<<endl;
385 //get detector and geometry
386 AliRunLoader *rl, *orl;
387 AliLoader *gime, *ogime;
390 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
391 ogime = orl->GetLoader("TPCLoader");
393 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
394 //gime = rl->GetLoader("TPCLoader");
395 rl->GetLoader("TPCLoader");
397 AliRun* alirun = rl->GetAliRun();
399 AliTPC *pTPC = (AliTPC *) alirun->GetModule("TPC");
400 AliTPCParam * param = pTPC->GetParam();
401 pTPC->GenerNoise(500000); //create teble with noise
402 printf("noise %f \n", param->GetNoise()*param->GetNoiseNormFac());
404 Int_t nInputs = fManager->GetNinputs();
405 // stupid protection...
406 if (nInputs <= 0) return;
408 Int_t * masks = new Int_t[nInputs];
409 for (Int_t i=0; i<nInputs;i++)
410 masks[i]= fManager->GetMask(i);
412 AliSimDigits ** digarr = new AliSimDigits*[nInputs];
413 for(Int_t ii=0;ii<nInputs;ii++) digarr[ii]=0;
415 for (Int_t i1=0;i1<nInputs; i1++)
419 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i1));
420 gime = rl->GetLoader("TPCLoader");
422 TTree * treear = gime->TreeS();
425 cerr<<" TPC - not existing input = \n"<<i1<<" ";
427 for(Int_t i=0; i<nInputs; i++) delete digarr[i];
432 TBranch * br = treear->GetBranch("fSegmentID");
433 if (br) br->GetFile()->cd();
434 treear->GetBranch("Segment")->SetAddress(&digarr[i1]);
437 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
438 gime = rl->GetLoader("TPCLoader");
439 Stat_t nentries = gime->TreeS()->GetEntries();
442 //create branch's in TPC treeD
443 AliSimDigits * digrow = new AliSimDigits;
444 TTree * tree = ogime->TreeD();
446 tree->Branch("Segment","AliSimDigits",&digrow);
447 param->SetZeroSup(2);
449 Int_t zerosup = param->GetZeroSup();
450 //Loop over segments of the TPC
452 AliTPCCalPad * gainTPC = AliTPCcalibDB::Instance()->GetDedxGainFactor();
453 AliTPCCalPad * noiseTPC = AliTPCcalibDB::Instance()->GetPadNoise();
454 for (Int_t n=0; n<nentries; n++) {
455 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
456 gime = rl->GetLoader("TPCLoader");
457 gime->TreeS()->GetEvent(n);
459 digarr[0]->ExpandBuffer();
460 digarr[0]->ExpandTrackBuffer();
463 for (Int_t i=1;i<nInputs; i++){
464 // fManager->GetInputTreeTPCS(i)->GetEntryWithIndex(digarr[0]->GetID(),digarr[0]->GetID());
465 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
466 gime = rl->GetLoader("TPCLoader");
467 gime->TreeS()->GetEntryWithIndex(digarr[0]->GetID(),digarr[0]->GetID());
468 digarr[i]->ExpandBuffer();
469 digarr[i]->ExpandTrackBuffer();
470 if ((digarr[0]->GetID()-digarr[i]->GetID())>0)
476 if (!param->AdjustSectorRow(digarr[0]->GetID(),sec,row)) {
477 cerr<<"AliTPC warning: invalid segment ID ! "<<digarr[0]->GetID()<<endl;
481 AliTPCCalROC * gainROC = gainTPC->GetCalROC(sec); // pad gains per given sector
482 AliTPCCalROC * noiseROC = noiseTPC->GetCalROC(sec); // noise per given sector
483 digrow->SetID(digarr[0]->GetID());
485 Int_t nrows = digarr[0]->GetNRows();
486 Int_t ncols = digarr[0]->GetNCols();
487 digrow->Allocate(nrows,ncols);
488 digrow->AllocateTrack(3);
491 Int_t label[1000]; //stack for 300 events
496 for (Int_t rows=0;rows<nrows; rows++){
497 for (Int_t col=0;col<ncols; col++){
502 for (Int_t i=0;i<nInputs; i++){
503 q += digarr[i]->GetDigitFast(rows,col);
506 for (Int_t tr=0;tr<3;tr++) {
507 Int_t lab = digarr[i]->GetTrackIDFast(rows,col,tr);
508 //Int_t lab = ptr[i][tr*nElems];
510 label[labptr]=lab+masks[i];
518 q/=16.; //conversion factor
519 // Float_t noise = gRandom->Gaus(0,param->GetNoise()*param->GetNoiseNormFac());
520 Float_t gain = gainROC->GetValue(row,col);
522 Float_t noisePad = noiseROC->GetValue(row, col);
524 Float_t noise = pTPC->GetNoise();
530 if(q >= param->GetADCSat()) q = (Short_t)(param->GetADCSat() - 1);
531 digrow->SetDigitFast((Short_t)q,rows,col);
532 // *pdig1 =Short_t(q);
533 for (Int_t tr=0;tr<3;tr++){
535 ((AliSimDigits*)digrow)->SetTrackIDFast(label[tr],rows,col,tr);
536 //ptr1[tr*nElems] = label[tr];
538 // ((AliSimDigits*)digrow)->SetTrackIDFast(-1,rows,col,tr);
539 // ptr1[tr*nElems] = 1;
547 digrow->CompresBuffer(1,zerosup);
548 digrow->CompresTrackBuffer(1);
550 if (fDebug>0) cerr<<sec<<"\t"<<row<<"\n";
552 // printf("end TPC merging - end -Tree %s\t%p\n",fManager->GetInputTreeH(0)->GetName(),fManager->GetInputTreeH(0)->GetListOfBranches()->At(3));
553 //fManager->GetTreeDTPC()->Write(0,TObject::kOverwrite);
554 ogime->WriteDigits("OVERWRITE");
556 for (Int_t i=1;i<nInputs; i++)
558 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
559 gime = rl->GetLoader("TPCLoader");
560 gime->UnloadSDigits();
562 ogime->UnloadDigits();
565 for (Int_t i1=0;i1<nInputs; i1++) delete digarr[i1];