]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TPC/AliTPCDigitizer.cxx
Merge Jens and Christian changes
[u/mrichter/AliRoot.git] / TPC / AliTPCDigitizer.cxx
CommitLineData
3c038d07 1/**************************************************************************
2 * Copyright(c) 1998-2000, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
88cb7938 16/* $Id$ */
d37f8c34 17
18#include <stdlib.h>
3c038d07 19#include <TTree.h>
20#include <TObjArray.h>
21#include <TFile.h>
22#include <TDirectory.h>
19364939 23#include <Riostream.h>
3c038d07 24
25#include "AliTPCDigitizer.h"
26
27#include "AliTPC.h"
28#include "AliTPCParam.h"
7a09f434 29#include "AliTPCParamSR.h"
3c038d07 30#include "AliRun.h"
31#include "AliPDG.h"
32#include "AliRunDigitizer.h"
33#include "AliSimDigits.h"
f77f13c8 34#include "AliLog.h"
3c038d07 35
13116aec 36#include "AliTPCcalibDB.h"
37#include "AliTPCCalPad.h"
38#include "AliTPCCalROC.h"
39
3c038d07 40ClassImp(AliTPCDigitizer)
41
42//___________________________________________
179c6296 43 AliTPCDigitizer::AliTPCDigitizer() :AliDigitizer(),fDebug(0)
3c038d07 44{
179c6296 45 //
3c038d07 46// Default ctor - don't use it
179c6296 47//
48
3c038d07 49}
50
51//___________________________________________
52AliTPCDigitizer::AliTPCDigitizer(AliRunDigitizer* manager)
179c6296 53 :AliDigitizer(manager),fDebug(0)
3c038d07 54{
179c6296 55 //
3c038d07 56// ctor which should be used
179c6296 57//
f77f13c8 58 AliDebug(2,"(AliRunDigitizer* manager) was processed");
3c038d07 59}
60
61//------------------------------------------------------------------------
62AliTPCDigitizer::~AliTPCDigitizer()
63{
64// Destructor
65}
66
67
68
69//------------------------------------------------------------------------
70Bool_t AliTPCDigitizer::Init()
71{
72// Initialization
73
74 return kTRUE;
75}
76
77
78//------------------------------------------------------------------------
79void AliTPCDigitizer::Exec(Option_t* option)
f648982e 80{
81 ExecFast(option);
82}
83//------------------------------------------------------------------------
84void AliTPCDigitizer::ExecFast(Option_t* option)
3c038d07 85{
86
87 // merge input tree's with summable digits
88 //output stored in TreeTPCD
7a09f434 89 char s[100];
90 char ss[100];
3c038d07 91 TString optionString = option;
92 if (optionString.Data() == "deb") {
93 cout<<"AliTPCDigitizer::Exec: called with option deb "<<endl;
94 fDebug = 3;
95 }
96 //get detector and geometry
88cb7938 97
98
99 AliRunLoader *rl, *orl;
100 AliLoader *gime, *ogime;
101
102 if (gAlice == 0x0)
103 {
104 Warning("ExecFast","gAlice is NULL. Loading from input 0");
105 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
106 if (rl == 0x0)
107 {
108 Error("ExecFast","Can not find Run Loader for input 0. Can not proceed.");
109 return;
110 }
111 rl->LoadgAlice();
112 rl->GetAliRun();
113 }
3c038d07 114 AliTPC *pTPC = (AliTPC *) gAlice->GetModule("TPC");
115 AliTPCParam * param = pTPC->GetParam();
7a09f434 116
117 sprintf(s,param->GetTitle());
118 sprintf(ss,"75x40_100x60");
119 if(strcmp(s,ss)==0){
120 printf("2 pad-length geom hits with 3 pad-lenght geom digits...\n");
121 delete param;
122 param=new AliTPCParamSR();
123 }
124 else{
125 sprintf(ss,"75x40_100x60_150x60");
126 if(strcmp(s,ss)!=0) {
127 printf("No TPC parameters found...\n");
128 exit(2);
129 }
130 }
131
407ff276 132 pTPC->GenerNoise(500000); //create teble with noise
407ff276 133 //
134 Int_t nInputs = fManager->GetNinputs();
135 Int_t * masks = new Int_t[nInputs];
136 for (Int_t i=0; i<nInputs;i++)
137 masks[i]= fManager->GetMask(i);
138 Short_t **pdig= new Short_t*[nInputs]; //pointers to the expanded digits array
139 Int_t **ptr= new Int_t*[nInputs]; //pointers to teh expanded tracks array
4df28b43 140 Bool_t *active= new Bool_t[nInputs]; //flag for active input segments
407ff276 141
88cb7938 142
3c038d07 143 //create digits array for given sectors
f648982e 144 // make indexes
88cb7938 145
407ff276 146 AliSimDigits ** digarr = new AliSimDigits*[nInputs];
88cb7938 147 for (Int_t i1=0;i1<nInputs; i1++)
148 {
149 digarr[i1]=0;
150 // intree[i1]
151 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i1));
152 gime = rl->GetLoader("TPCLoader");
153 gime->LoadSDigits("read");
154 TTree * treear = gime->TreeS();
155
156 if (!treear)
157 {
158 cerr<<"AliTPCDigitizer: Input tree with SDigits not found in"
159 <<" input "<< i1<<endl;
160 return;
161 }
88cb7938 162
163 if (treear->GetIndex()==0)
164 treear->BuildIndex("fSegmentID","fSegmentID");
165 treear->GetBranch("Segment")->SetAddress(&digarr[i1]);
12d8d654 166 }
88cb7938 167
3c038d07 168
169 //create branch's in TPC treeD
170 AliSimDigits * digrow = new AliSimDigits;
88cb7938 171
172 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
173 ogime = orl->GetLoader("TPCLoader");
174
175 TTree * tree = ogime->TreeD();
176 if (tree == 0x0)
177 {
178 ogime->MakeTree("D");
179 tree = ogime->TreeD();
180 }
170950c3 181 tree->Branch("Segment","AliSimDigits",&digrow);
3c038d07 182 //
183
407ff276 184 param->SetZeroSup(2);
185
f648982e 186 Int_t zerosup = param->GetZeroSup();
13116aec 187 AliTPCCalPad * gainTPC = AliTPCcalibDB::Instance()->GetPadGainFactor();
1ac191a6 188 AliTPCCalPad * noiseTPC = AliTPCcalibDB::Instance()->GetPadNoise();
f648982e 189 //
3c038d07 190 //Loop over segments of the TPC
191
4df28b43 192 for (Int_t segmentID=0; segmentID<param->GetNRowsTotal(); segmentID++)
88cb7938 193 {
4df28b43 194 Int_t sec, row;
195 if (!param->AdjustSectorRow(segmentID,sec,row))
196 {
197 cerr<<"AliTPC warning: invalid segment ID ! "<<segmentID<<endl;
198 continue;
199 }
13116aec 200 AliTPCCalROC * gainROC = gainTPC->GetCalROC(sec); // pad gains per given sector
1ac191a6 201 AliTPCCalROC * noiseROC = noiseTPC->GetCalROC(sec); // noise per given sector
4df28b43 202 digrow->SetID(segmentID);
203
204 Int_t nrows = 0;
205 Int_t ncols = 0;
206
207 Bool_t digitize = kFALSE;
208 for (Int_t i=0;i<nInputs; i++)
88cb7938 209 {
210
211 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
212 gime = rl->GetLoader("TPCLoader");
213
4df28b43 214 if (gime->TreeS()->GetEntryWithIndex(segmentID,segmentID) >= 0) {
215 digarr[i]->ExpandBuffer();
216 digarr[i]->ExpandTrackBuffer();
217 nrows = digarr[i]->GetNRows();
218 ncols = digarr[i]->GetNCols();
219 active[i] = kTRUE;
220 if (!fRegionOfInterest || (i == 0)) digitize = kTRUE;
221 } else {
222 active[i] = kFALSE;
223 }
224 if (fRegionOfInterest && !digitize) break;
88cb7938 225 }
4df28b43 226 if (!digitize) continue;
3c038d07 227
3c038d07 228 digrow->Allocate(nrows,ncols);
229 digrow->AllocateTrack(3);
230
407ff276 231 Float_t q=0;
232 Int_t label[1000]; //stack for 300 events
233 Int_t labptr = 0;
234
f648982e 235 Int_t nElems = nrows*ncols;
236
88cb7938 237 for (Int_t i=0;i<nInputs; i++)
4df28b43 238 if (active[i]) {
88cb7938 239 pdig[i] = digarr[i]->GetDigits();
240 ptr[i] = digarr[i]->GetTracks();
4df28b43 241 }
88cb7938 242
407ff276 243 Short_t *pdig1= digrow->GetDigits();
244 Int_t *ptr1= digrow->GetTracks() ;
245
f648982e 246
407ff276 247
88cb7938 248 for (Int_t elem=0;elem<nElems; elem++)
249 {
250
251 q=0;
252 labptr=0;
253 // looop over digits
4df28b43 254 for (Int_t i=0;i<nInputs; i++) if (active[i])
88cb7938 255 {
256 // q += digarr[i]->GetDigitFast(rows,col);
257 q += *(pdig[i]);
258
259 for (Int_t tr=0;tr<3;tr++)
260 {
261 // Int_t lab = digarr[i]->GetTrackIDFast(rows,col,tr);
262 Int_t lab = ptr[i][tr*nElems];
263 if ( (lab > 1) && *(pdig[i])>zerosup)
264 {
265 label[labptr]=lab+masks[i];
266 labptr++;
267 }
268 }
269 pdig[i]++;
270 ptr[i]++;
271 }
272 q/=16.; //conversion factor
13116aec 273 Float_t gain = gainROC->GetValue(row,elem/nrows); // get gain for given - pad-row pad
274 if (gain<0.5){
275 printf("problem\n");
276 }
277 q*= gain;
1ac191a6 278 Float_t noisePad = noiseROC->GetValue(row,elem/nrows);
88cb7938 279 // Float_t noise = gRandom->Gaus(0,param->GetNoise()*param->GetNoiseNormFac());
280 Float_t noise = pTPC->GetNoise();
1ac191a6 281 q+=noise*noisePad;
3c038d07 282 q=TMath::Nint(q);
88cb7938 283 if (q > zerosup)
284 {
e93a083a 285 if(q >= param->GetADCSat()) q = (Short_t)(param->GetADCSat() - 1);
88cb7938 286 //digrow->SetDigitFast((Short_t)q,rows,col);
287 *pdig1 =Short_t(q);
288 for (Int_t tr=0;tr<3;tr++)
289 {
290 if (tr<labptr)
291 ptr1[tr*nElems] = label[tr];
292 }
293 }
294 pdig1++;
295 ptr1++;
296 }
407ff276 297
3c038d07 298 digrow->CompresBuffer(1,zerosup);
299 digrow->CompresTrackBuffer(1);
300 tree->Fill();
301 if (fDebug>0) cerr<<sec<<"\t"<<row<<"\n";
4df28b43 302 } //for (Int_t n=0; n<param->GetNRowsTotal(); n++)
88cb7938 303
304
305 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
306 ogime = orl->GetLoader("TPCLoader");
307 ogime->WriteDigits("OVERWRITE");
308
309 //fManager->GetTreeDTPC()->Write(0,TObject::kOverwrite);
310
3c038d07 311 delete digrow;
407ff276 312 for (Int_t i1=0;i1<nInputs; i1++) delete digarr[i1];
313 delete []masks;
4df28b43 314 delete []pdig;
315 delete []ptr;
316 delete []active;
317 delete []digarr;
3c038d07 318}
319
f648982e 320
321
322//------------------------------------------------------------------------
323void AliTPCDigitizer::ExecSave(Option_t* option)
324{
325
326 // merge input tree's with summable digits
327 //output stored in TreeTPCD
328
329 TString optionString = option;
330 if (optionString.Data() == "deb") {
331 cout<<"AliTPCDigitizer::Exec: called with option deb "<<endl;
332 fDebug = 3;
333 }
334 //get detector and geometry
88cb7938 335 AliRunLoader *rl, *orl;
336 AliLoader *gime, *ogime;
337
338
339 orl = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
340 ogime = orl->GetLoader("TPCLoader");
341
342 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
343 gime = rl->GetLoader("TPCLoader");
344
345 rl->LoadgAlice();
346 AliRun* alirun = rl->GetAliRun();
347
348 AliTPC *pTPC = (AliTPC *) alirun->GetModule("TPC");
f648982e 349 AliTPCParam * param = pTPC->GetParam();
350 pTPC->GenerNoise(500000); //create teble with noise
351 printf("noise %f \n", param->GetNoise()*param->GetNoiseNormFac());
352 //
353 Int_t nInputs = fManager->GetNinputs();
354 Int_t * masks = new Int_t[nInputs];
355 for (Int_t i=0; i<nInputs;i++)
356 masks[i]= fManager->GetMask(i);
f648982e 357
f648982e 358 AliSimDigits ** digarr = new AliSimDigits*[nInputs];
88cb7938 359 for (Int_t i1=0;i1<nInputs; i1++)
360 {
f648982e 361 digarr[i1]=0;
362 // intree[i1]
88cb7938 363 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i1));
364 gime = rl->GetLoader("TPCLoader");
365
366 TTree * treear = gime->TreeS();
f648982e 367 TBranch * br = treear->GetBranch("fSegmentID");
368 if (br) br->GetFile()->cd();
f648982e 369 if (!treear) {
370 cerr<<" TPC - not existing input = \n"<<i1<<" ";
371 }
f648982e 372 treear->GetBranch("Segment")->SetAddress(&digarr[i1]);
f648982e 373 }
88cb7938 374
375 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
376 gime = rl->GetLoader("TPCLoader");
377 Stat_t nentries = gime->TreeS()->GetEntries();
f648982e 378
379
380 //create branch's in TPC treeD
381 AliSimDigits * digrow = new AliSimDigits;
88cb7938 382 TTree * tree = ogime->TreeD();
383
f648982e 384 tree->Branch("Segment","AliSimDigits",&digrow);
f648982e 385 param->SetZeroSup(2);
386
387 Int_t zerosup = param->GetZeroSup();
388 //Loop over segments of the TPC
389
13116aec 390 AliTPCCalPad * gainTPC = AliTPCcalibDB::Instance()->GetPadGainFactor();
1ac191a6 391 AliTPCCalPad * noiseTPC = AliTPCcalibDB::Instance()->GetPadNoise();
f648982e 392 for (Int_t n=0; n<nentries; n++) {
88cb7938 393 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
394 gime = rl->GetLoader("TPCLoader");
395 gime->TreeS()->GetEvent(n);
396
f648982e 397 digarr[0]->ExpandBuffer();
398 digarr[0]->ExpandTrackBuffer();
13116aec 399
400
f648982e 401 for (Int_t i=1;i<nInputs; i++){
88cb7938 402// fManager->GetInputTreeTPCS(i)->GetEntryWithIndex(digarr[0]->GetID(),digarr[0]->GetID());
403 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
404 gime = rl->GetLoader("TPCLoader");
405 gime->TreeS()->GetEntryWithIndex(digarr[0]->GetID(),digarr[0]->GetID());
f648982e 406 digarr[i]->ExpandBuffer();
407 digarr[i]->ExpandTrackBuffer();
408 if ((digarr[0]->GetID()-digarr[i]->GetID())>0)
88cb7938 409 printf("problem\n");
f648982e 410
411 }
412
413 Int_t sec, row;
414 if (!param->AdjustSectorRow(digarr[0]->GetID(),sec,row)) {
415 cerr<<"AliTPC warning: invalid segment ID ! "<<digarr[0]->GetID()<<endl;
416 continue;
417 }
418
13116aec 419 AliTPCCalROC * gainROC = gainTPC->GetCalROC(sec); // pad gains per given sector
1ac191a6 420 AliTPCCalROC * noiseROC = noiseTPC->GetCalROC(sec); // noise per given sector
f648982e 421 digrow->SetID(digarr[0]->GetID());
422
423 Int_t nrows = digarr[0]->GetNRows();
424 Int_t ncols = digarr[0]->GetNCols();
425 digrow->Allocate(nrows,ncols);
426 digrow->AllocateTrack(3);
427
428 Float_t q=0;
429 Int_t label[1000]; //stack for 300 events
430 Int_t labptr = 0;
431
432
433
434 for (Int_t rows=0;rows<nrows; rows++){
435 for (Int_t col=0;col<ncols; col++){
436
88cb7938 437 q=0;
438 labptr=0;
439 // looop over digits
f648982e 440 for (Int_t i=0;i<nInputs; i++){
88cb7938 441 q += digarr[i]->GetDigitFast(rows,col);
f648982e 442 //q += *(pdig[i]);
88cb7938 443
f648982e 444 for (Int_t tr=0;tr<3;tr++) {
88cb7938 445 Int_t lab = digarr[i]->GetTrackIDFast(rows,col,tr);
446 //Int_t lab = ptr[i][tr*nElems];
f648982e 447 if ( (lab > 1) ) {
448 label[labptr]=lab+masks[i];
449 labptr++;
88cb7938 450 }
f648982e 451 }
88cb7938 452 // pdig[i]++;
453 //ptr[i]++;
454
f648982e 455 }
88cb7938 456 q/=16.; //conversion factor
457 // Float_t noise = gRandom->Gaus(0,param->GetNoise()*param->GetNoiseNormFac());
13116aec 458 Float_t gain = gainROC->GetValue(row,col);
459 q*= gain;
1ac191a6 460 Float_t noisePad = noiseROC->GetValue(row, col);
461
88cb7938 462 Float_t noise = pTPC->GetNoise();
1ac191a6 463 q+=noise*noisePad;
f648982e 464 q=TMath::Nint(q);
465 if (q > zerosup){
88cb7938 466
e93a083a 467 if(q >= param->GetADCSat()) q = (Short_t)(param->GetADCSat() - 1);
88cb7938 468 digrow->SetDigitFast((Short_t)q,rows,col);
469 // *pdig1 =Short_t(q);
470 for (Int_t tr=0;tr<3;tr++){
471 if (tr<labptr)
472 ((AliSimDigits*)digrow)->SetTrackIDFast(label[tr],rows,col,tr);
473 //ptr1[tr*nElems] = label[tr];
474 //else
475 // ((AliSimDigits*)digrow)->SetTrackIDFast(-1,rows,col,tr);
476 // ptr1[tr*nElems] = 1;
477 }
478 }
479 //pdig1++;
480 //ptr1++;
f648982e 481 }
482 }
483
484 digrow->CompresBuffer(1,zerosup);
485 digrow->CompresTrackBuffer(1);
486 tree->Fill();
487 if (fDebug>0) cerr<<sec<<"\t"<<row<<"\n";
488 }
88cb7938 489// printf("end TPC merging - end -Tree %s\t%p\n",fManager->GetInputTreeH(0)->GetName(),fManager->GetInputTreeH(0)->GetListOfBranches()->At(3));
490 //fManager->GetTreeDTPC()->Write(0,TObject::kOverwrite);
491 ogime->WriteDigits("OVERWRITE");
492
493 for (Int_t i=1;i<nInputs; i++)
494 {
495 rl = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(i));
496 gime = rl->GetLoader("TPCLoader");
497 gime->UnloadSDigits();
498 }
499 ogime->UnloadDigits();
500
f648982e 501 delete digrow;
502 for (Int_t i1=0;i1<nInputs; i1++) delete digarr[i1];
503 delete []masks;
504 delete digarr;
505}