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 //_________________________________________________________________________
20 //////////////////////////////////////////////////////////////////////////////
21 // Class performs digitization of Summable digits
23 // In addition it performs mixing of summable digits from different events.
25 // For each event two branches are created in TreeD:
26 // "EMCAL" - list of digits
27 // "AliEMCALDigitizer" - AliEMCALDigitizer with all parameters used in digitization
29 // Note, that one cset title for new digits branch, and repeat digitization with
30 // another set of parameters.
33 // root[0] AliEMCALDigitizer * d = new AliEMCALDigitizer() ;
34 // root[1] d->ExecuteTask()
35 // Warning in <TDatabasePDG::TDatabasePDG>: object already instantiated
36 // //Digitizes SDigitis in all events found in file galice.root
38 // root[2] AliEMCALDigitizer * d1 = new AliEMCALDigitizer("galice1.root") ;
39 // // Will read sdigits from galice1.root
40 // root[3] d1->MixWith("galice2.root")
41 // Warning in <TDatabasePDG::TDatabasePDG>: object already instantiated
42 // // Reads another portion of sdigits from galice2.root
43 // root[3] d1->MixWith("galice3.root")
44 // // Reads another portion of sdigits from galice3.root
45 // root[4] d->ExecuteTask("deb timing")
46 // // Reads SDigits from files galice1.root, galice2.root ....
47 // // mixes them and stores produced Digits in file galice1.root
48 // // deb - prints number of produced digits
49 // // deb all - prints list of produced digits
50 // // timing - prints time used for digitization
51 ////////////////////////////////////////////////////////////////////////////////////
53 //*-- Author: Sahal Yacoob (LBL)
54 // based on : AliEMCALDigitizer
56 // August 2002 Yves Schutz: clone PHOS as closely as possible and intoduction
57 // of new IO (à la PHOS)
58 // November 2003 Aleksei Pavlinov : adopted for Shish-Kebab geometry
59 //_________________________________________________________________________________
61 // --- ROOT system ---
65 #include "TBenchmark.h"
69 #include "TObjectTable.h"
71 // --- AliRoot header files ---
74 #include "AliRunDigitizer.h"
75 #include "AliRunLoader.h"
76 #include "AliEMCALDigit.h"
78 #include "AliEMCALLoader.h"
79 #include "AliEMCALDigitizer.h"
80 #include "AliEMCALSDigitizer.h"
81 #include "AliEMCALGeometry.h"
82 #include "AliEMCALTick.h"
83 #include "AliEMCALHistoUtilities.h"
85 ClassImp(AliEMCALDigitizer)
88 //____________________________________________________________________________
89 AliEMCALDigitizer::AliEMCALDigitizer()
90 : AliDigitizer("",""),
98 fMeanPhotonElectron(0),
104 fTimeSignalLength(0),
108 fEventFolderName(""),
116 fManager = 0 ; // We work in the standalong mode
119 //____________________________________________________________________________
120 AliEMCALDigitizer::AliEMCALDigitizer(TString alirunFileName, TString eventFolderName)
121 : AliDigitizer("EMCAL"+AliConfig::Instance()->GetDigitizerTaskName(), alirunFileName),
122 fDefaultInit(kFALSE),
129 fMeanPhotonElectron(0),
135 fTimeSignalLength(0),
139 fEventFolderName(eventFolderName),
148 fManager = 0 ; // We work in the standalong mode
151 //____________________________________________________________________________
152 AliEMCALDigitizer::AliEMCALDigitizer(const AliEMCALDigitizer & d)
153 : AliDigitizer(d.GetName(),d.GetTitle()),
154 fDefaultInit(d.fDefaultInit),
155 fDigitsInRun(d.fDigitsInRun),
158 fInputFileNames(d.fInputFileNames),
159 fEventNames(d.fEventNames),
160 fDigitThreshold(d.fDigitThreshold),
161 fMeanPhotonElectron(d.fMeanPhotonElectron),
162 fPedestal(d.fPedestal),
164 fPinNoise(d.fPinNoise),
165 fTimeResolution(d.fTimeResolution),
166 fTimeThreshold(d.fTimeThreshold),
167 fTimeSignalLength(d.fTimeSignalLength),
168 fADCchannelEC(d.fADCchannelEC),
169 fADCpedestalEC(d.fADCpedestalEC),
171 fEventFolderName(d.fEventFolderName),
172 fFirstEvent(d.fFirstEvent),
173 fLastEvent(d.fLastEvent),
174 fControlHists(d.fControlHists),
180 //____________________________________________________________________________
181 AliEMCALDigitizer::AliEMCALDigitizer(AliRunDigitizer * rd)
182 : AliDigitizer(rd,"EMCAL"+AliConfig::Instance()->GetDigitizerTaskName()),
183 fDefaultInit(kFALSE),
190 fMeanPhotonElectron(0),
196 fTimeSignalLength(0),
206 // ctor Init() is called by RunDigitizer
208 fEventFolderName = fManager->GetInputFolderName(0) ;
209 SetTitle(dynamic_cast<AliStream*>(fManager->GetInputStream(0))->GetFileName(0));
213 //____________________________________________________________________________
214 AliEMCALDigitizer::~AliEMCALDigitizer()
217 if (AliRunLoader::GetRunLoader()) {
218 AliLoader *emcalLoader=0;
219 if ((emcalLoader = AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL")))
220 emcalLoader->CleanDigitizer();
223 AliDebug(1," no runloader present");
224 delete [] fInputFileNames ;
225 delete [] fEventNames ;
227 if(fHists) delete fHists;
230 //____________________________________________________________________________
231 void AliEMCALDigitizer::Digitize(Int_t event)
234 // Makes the digitization of the collected summable digits
235 // for this it first creates the array of all EMCAL modules
236 // filled with noise (different for EMC, CPV and PPSD) and
237 // after that adds contributions from SDigits. This design
238 // helps to avoid scanning over the list of digits to add
239 // contribution of any new SDigit.
240 static int isTrd1Geom = -1; // -1 - mean undefined
241 static int nEMC=0; //max number of digits possible
243 AliRunLoader *rl = AliRunLoader::GetRunLoader();
244 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(rl->GetDetectorLoader("EMCAL"));
245 Int_t readEvent = event ;
246 // fManager is data member from AliDigitizer
248 readEvent = dynamic_cast<AliStream*>(fManager->GetInputStream(0))->GetCurrentEventNumber() ;
249 AliDebug(1,Form("Adding event %d from input stream 0 %s %s",
250 readEvent, GetTitle(), fEventFolderName.Data())) ;
251 rl->GetEvent(readEvent);
253 TClonesArray * digits = emcalLoader->Digits() ;
257 // const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
259 AliRun * gAlice = rl->GetAliRun();
260 AliEMCAL * emcal = (AliEMCAL*)gAlice->GetDetector("EMCAL");
261 AliEMCALGeometry * geom = emcal->GetGeometry();
264 TString ng(geom->GetName());
266 if(ng.Contains("SHISH") && ng.Contains("TRD1")) isTrd1Geom = 1;
268 if(isTrd1Geom == 0) nEMC = geom->GetNPhi()*geom->GetNZ();
269 else nEMC = geom->GetNCells();
270 AliDebug(1,Form("nEMC %i (number cells in EMCAL) | %s | isTrd1Geom %i\n", nEMC, geom->GetName(), isTrd1Geom));
274 digits->Expand(nEMC) ;
276 // get first the sdigitizer from the tasks list (must have same name as the digitizer)
277 if ( !emcalLoader->SDigitizer() )
278 emcalLoader->LoadSDigitizer();
279 AliEMCALSDigitizer * sDigitizer = dynamic_cast<AliEMCALSDigitizer*>(emcalLoader->SDigitizer());
282 Fatal("Digitize", "SDigitizer with name %s %s not found", fEventFolderName.Data(), GetTitle() ) ;
284 //take all the inputs to add together and load the SDigits
285 TObjArray * sdigArray = new TObjArray(fInput) ;
286 sdigArray->AddAt(emcalLoader->SDigits(), 0) ;
289 for(i = 1 ; i < fInput ; i++){
290 TString tempo(fEventNames[i]) ;
293 AliRunLoader * rl2 = AliRunLoader::GetRunLoader(tempo) ;
296 rl2 = AliRunLoader::Open(fInputFileNames[i], tempo) ;
299 readEvent = dynamic_cast<AliStream*>(fManager->GetInputStream(i))->GetCurrentEventNumber() ;
300 Info("Digitize", "Adding event %d from input stream %d %s %s", readEvent, i, fInputFileNames[i].Data(), tempo.Data()) ;
302 rl2->GetEvent(readEvent);
303 AliEMCALLoader *emcalLoader2 = dynamic_cast<AliEMCALLoader*>(rl2->GetDetectorLoader("EMCAL"));
304 sdigArray->AddAt(emcalLoader2->SDigits(), i) ;
307 //Find the first tower with signal
308 Int_t nextSig = nEMC + 1 ;
309 TClonesArray * sdigits ;
310 for(i = 0 ; i < fInput ; i++){
311 sdigits = dynamic_cast<TClonesArray *>(sdigArray->At(i)) ;
312 if ( !sdigits->GetEntriesFast() )
314 Int_t curNext = dynamic_cast<AliEMCALDigit *>(sdigits->At(0))->GetId() ;
315 if(curNext < nextSig)
317 AliDebug(1,Form("input %i : #sdigits %i \n",
318 i, sdigits->GetEntriesFast()));
320 AliDebug(1,Form("FIRST tower with signal %i \n", nextSig));
322 TArrayI index(fInput) ;
323 index.Reset() ; //Set all indexes to zero
325 AliEMCALDigit * digit ;
326 AliEMCALDigit * curSDigit ;
328 TClonesArray * ticks = new TClonesArray("AliEMCALTick",1000) ;
330 //Put Noise contribution
331 for(absID = 1; absID <= nEMC; absID++){
333 // amplitude set to zero, noise will be added later
334 new((*digits)[absID-1]) AliEMCALDigit( -1, -1, absID, 0, TimeOfNoise() ) ;
335 //look if we have to add signal?
336 digit = dynamic_cast<AliEMCALDigit *>(digits->At(absID-1)) ;
339 //Add SDigits from all inputs
342 Float_t a = digit->GetAmp() ;
343 Float_t b = TMath::Abs( a /fTimeSignalLength) ;
344 //Mark the beginning of the signal
345 new((*ticks)[contrib++]) AliEMCALTick(digit->GetTime(),0, b);
346 //Mark the end of the signal
347 new((*ticks)[contrib++]) AliEMCALTick(digit->GetTime()+fTimeSignalLength, -a, -b);
350 for(i = 0; i< fInput ; i++){ //loop over (possible) merge sources
351 if(dynamic_cast<TClonesArray *>(sdigArray->At(i))->GetEntriesFast() > index[i] )
352 curSDigit = dynamic_cast<AliEMCALDigit*>(dynamic_cast<TClonesArray *>(sdigArray->At(i))->At(index[i])) ;
355 //May be several digits will contribute from the same input
356 while(curSDigit && (curSDigit->GetId() == absID)){
357 //Shift primary to separate primaries belonging different inputs
358 Int_t primaryoffset ;
360 primaryoffset = fManager->GetMask(i) ;
363 curSDigit->ShiftPrimary(primaryoffset) ;
365 a = curSDigit->GetAmp() ;
366 b = a /fTimeSignalLength ;
367 new((*ticks)[contrib++]) AliEMCALTick(curSDigit->GetTime(),0, b);
368 new((*ticks)[contrib++]) AliEMCALTick(curSDigit->GetTime()+fTimeSignalLength, -a, -b);
370 *digit = *digit + *curSDigit ; //add energies
373 if( dynamic_cast<TClonesArray *>(sdigArray->At(i))->GetEntriesFast() > index[i] )
374 curSDigit = dynamic_cast<AliEMCALDigit*>(dynamic_cast<TClonesArray *>(sdigArray->At(i))->At(index[i])) ;
379 // add fluctuations for photo-electron creation
380 amp = sDigitizer->Calibrate(digit->GetAmp()) ; // GeV
381 amp *= static_cast<Float_t>(gRandom->Poisson(fMeanPhotonElectron)) / static_cast<Float_t>(fMeanPhotonElectron) ;
383 //calculate and set time
384 Float_t time = FrontEdgeTime(ticks) ;
385 digit->SetTime(time) ;
387 //Find next signal module
389 for(i = 0 ; i < fInput ; i++){
390 sdigits = dynamic_cast<TClonesArray *>(sdigArray->At(i)) ;
391 Int_t curNext = nextSig ;
392 if(sdigits->GetEntriesFast() > index[i] ){
393 curNext = dynamic_cast<AliEMCALDigit *>(sdigits->At(index[i]))->GetId() ;
395 if(curNext < nextSig) nextSig = curNext ;
399 amp += TMath::Abs(gRandom->Gaus(0., fPinNoise)) ;
400 digit->SetAmp(sDigitizer->Digitize(amp)) ;
401 AliDebug(10,Form(" absID %5i amp %f nextSig %5i\n",
402 absID, amp, nextSig));
403 } // for(absID = 1; absID <= nEMC; absID++)
408 delete sdigArray ; //We should not delete its contents
410 //remove digits below thresholds
411 for(i = 0 ; i < nEMC ; i++){
412 digit = dynamic_cast<AliEMCALDigit*>( digits->At(i) ) ;
413 Float_t threshold = fDigitThreshold ;
414 if(sDigitizer->Calibrate( digit->GetAmp() ) < threshold)
415 digits->RemoveAt(i) ;
417 digit->SetTime(gRandom->Gaus(digit->GetTime(),fTimeResolution) ) ;
422 Int_t ndigits = digits->GetEntriesFast() ;
423 digits->Expand(ndigits) ;
425 //Set indexes in list of digits and fill hists.
426 AliEMCALHistoUtilities::FillH1(fHists, 0, Double_t(ndigits));
427 Float_t energy=0., esum=0.;
428 for (i = 0 ; i < ndigits ; i++) {
429 digit = dynamic_cast<AliEMCALDigit *>( digits->At(i) ) ;
430 digit->SetIndexInList(i) ;
431 energy = sDigitizer->Calibrate(digit->GetAmp()) ;
433 digit->SetAmp(DigitizeEnergy(energy, digit->GetId()) ) ; // for what ??
434 AliEMCALHistoUtilities::FillH1(fHists, 2, double(digit->GetAmp()));
435 AliEMCALHistoUtilities::FillH1(fHists, 3, double(energy));
436 AliEMCALHistoUtilities::FillH1(fHists, 4, double(digit->GetId()));
438 AliEMCALHistoUtilities::FillH1(fHists, 1, esum);
441 // //_____________________________________________________________________
442 Int_t AliEMCALDigitizer::DigitizeEnergy(Float_t energy, Int_t AbsId)
444 // Returns digitized value of the energy in a cell absId
446 AliRunLoader *rl = AliRunLoader::GetRunLoader();
447 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>
448 (rl->GetDetectorLoader("EMCAL"));
450 // Load EMCAL Geometry
452 AliRun * gAlice = rl->GetAliRun();
453 AliEMCAL * emcal = (AliEMCAL*)gAlice->GetDetector("EMCAL");
454 AliEMCALGeometry * geom = emcal->GetGeometry();
457 AliFatal("Did not get geometry from EMCALLoader") ;
465 Int_t channel = -999;
467 Bool_t bCell = geom->GetCellIndex(AbsId, iSupMod, nTower, nIphi, nIeta) ;
469 Error("DigitizeEnergy","Wrong cell id number") ;
470 geom->GetCellPhiEtaIndexInSModule(iSupMod,nTower,nIphi, nIeta,iphi,ieta);
472 if(emcalLoader->CalibData()) {
473 fADCpedestalEC = emcalLoader->CalibData()
474 ->GetADCpedestal(iSupMod,ieta,iphi);
475 fADCchannelEC = emcalLoader->CalibData()
476 ->GetADCchannel(iSupMod,ieta,iphi);
479 channel = static_cast<Int_t> (TMath::Ceil( (energy + fADCpedestalEC)/fADCchannelEC )) ;
481 if(channel > fNADCEC )
487 //____________________________________________________________________________
488 void AliEMCALDigitizer::Exec(Option_t *option)
490 // Steering method to process digitization for events
491 // in the range from fFirstEvent to fLastEvent.
492 // This range is optionally set by SetEventRange().
493 // if fLastEvent=-1, then process events until the end.
494 // by default fLastEvent = fFirstEvent (process only one event)
496 if (!fInit) { // to prevent overwrite existing file
497 Error( "Exec", "Give a version name different from %s", fEventFolderName.Data() ) ;
501 if (strstr(option,"print")) {
507 if(strstr(option,"tim"))
508 gBenchmark->Start("EMCALDigitizer");
510 AliRunLoader *rl = AliRunLoader::GetRunLoader();
511 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(rl->GetDetectorLoader("EMCAL"));
513 // Post Digitizer to the white board
514 emcalLoader->PostDigitizer(this) ;
516 if (fLastEvent == -1)
517 fLastEvent = rl->GetNumberOfEvents() - 1 ;
519 fLastEvent = fFirstEvent ; // what is this ??
521 Int_t nEvents = fLastEvent - fFirstEvent + 1;
524 rl->LoadSDigits("EMCAL");
525 for (ievent = fFirstEvent; ievent <= fLastEvent; ievent++) {
527 rl->GetEvent(ievent);
529 Digitize(ievent) ; //Add prepared SDigits to digits and add the noise
533 if(strstr(option,"deb"))
535 if(strstr(option,"table")) gObjectTable->Print();
537 //increment the total number of Digits per run
538 fDigitsInRun += emcalLoader->Digits()->GetEntriesFast() ;
541 emcalLoader->CleanDigitizer() ;
543 if(strstr(option,"tim")){
544 gBenchmark->Stop("EMCALDigitizer");
545 AliInfo(Form("Exec: took %f seconds for Digitizing %f seconds per event",
546 gBenchmark->GetCpuTime("EMCALDigitizer"), gBenchmark->GetCpuTime("EMCALDigitizer")/nEvents )) ;
550 //____________________________________________________________________________
551 Float_t AliEMCALDigitizer::FrontEdgeTime(TClonesArray * ticks)
553 // Returns the shortest time among all time ticks
555 ticks->Sort() ; //Sort in accordance with times of ticks
557 AliEMCALTick * ctick = (AliEMCALTick *) it.Next() ;
558 Float_t time = ctick->CrossingTime(fTimeThreshold) ;
561 while((t=(AliEMCALTick*) it.Next())){
562 if(t->GetTime() < time) //This tick starts before crossing
567 time = ctick->CrossingTime(fTimeThreshold) ;
572 //____________________________________________________________________________
573 Bool_t AliEMCALDigitizer::Init()
575 // Makes all memory allocations
577 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
579 if ( emcalLoader == 0 ) {
580 Fatal("Init", "Could not obtain the AliEMCALLoader");
585 fLastEvent = fFirstEvent ;
588 fInput = fManager->GetNinputs() ;
592 fInputFileNames = new TString[fInput] ;
593 fEventNames = new TString[fInput] ;
594 fInputFileNames[0] = GetTitle() ;
595 fEventNames[0] = fEventFolderName.Data() ;
597 for (index = 1 ; index < fInput ; index++) {
598 fInputFileNames[index] = dynamic_cast<AliStream*>(fManager->GetInputStream(index))->GetFileName(0);
599 TString tempo = fManager->GetInputFolderName(index) ;
600 fEventNames[index] = tempo.Remove(tempo.Length()-1) ; // strip of the stream number added bt fManager
603 //to prevent cleaning of this object while GetEvent is called
604 emcalLoader->GetDigitsDataLoader()->GetBaseTaskLoader()->SetDoNotReload(kTRUE);
611 //____________________________________________________________________________
612 void AliEMCALDigitizer::InitParameters()
614 //parameter initialization for digitizer
615 // Tune parameters - 24-nov-04
617 fMeanPhotonElectron = 3300 ; // electrons per GeV
619 if (fPinNoise == 0. )
620 Warning("InitParameters", "No noise added\n") ;
621 fDigitThreshold = fPinNoise * 3; // 3 * sigma
622 fTimeResolution = 0.3e-9 ; // 300 psc
623 fTimeSignalLength = 1.0e-9 ;
625 fADCchannelEC = 0.00305; // 200./65536 - width of one ADC channel in GeV
626 fADCpedestalEC = 0.009 ; // GeV
627 fNADCEC = (Int_t) TMath::Power(2,16) ; // number of channels in Tower ADC - 65536
629 fTimeThreshold = 0.001*10000000 ; // Means 1 MeV in terms of SDigits amplitude ??
630 // hists. for control; no hists on default
635 //__________________________________________________________________
636 void AliEMCALDigitizer::MixWith(TString alirunFileName, TString eventFolderName)
638 // Allows to produce digits by superimposing background and signal event.
639 // It is assumed, that headers file with SIGNAL events is opened in
641 // Sets the BACKGROUND event, with which the SIGNAL event is to be mixed
642 // Thus we avoid writing (changing) huge and expensive
643 // backgound files: all output will be writen into SIGNAL, i.e.
644 // opened in constructor file.
646 // One can open as many files to mix with as one needs.
647 // However only Sdigits with the same name (i.e. constructed with the same SDigitizer)
650 if( strcmp(GetName(), "") == 0 )
654 Error("MixWith", "Cannot use this method under AliRunDigitizer") ;
657 // looking for file which contains AliRun
658 if (gSystem->AccessPathName(alirunFileName)) {// file does not exist
659 Error("MixWith", "File %s does not exist!", alirunFileName.Data()) ;
662 // looking for the file which contains SDigits
663 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
664 TString fileName( emcalLoader->GetSDigitsFileName() ) ;
665 if ( eventFolderName != AliConfig::GetDefaultEventFolderName()) // only if not the default folder name
666 fileName = fileName.ReplaceAll(".root", "") + "_" + eventFolderName + ".root" ;
667 if ( (gSystem->AccessPathName(fileName)) ) {
668 Error("MixWith", "The file %s does not exist!", fileName.Data()) ;
671 // need to increase the arrays
672 TString tempo = fInputFileNames[fInput-1] ;
673 delete [] fInputFileNames ;
674 fInputFileNames = new TString[fInput+1] ;
675 fInputFileNames[fInput-1] = tempo ;
677 tempo = fEventNames[fInput-1] ;
678 delete [] fEventNames ;
679 fEventNames = new TString[fInput+1] ;
680 fEventNames[fInput-1] = tempo ;
682 fInputFileNames[fInput] = alirunFileName ;
683 fEventNames[fInput] = eventFolderName ;
687 void AliEMCALDigitizer::Print1(Option_t * option)
688 { // 19-nov-04 - just for convinience
693 //__________________________________________________________________
694 void AliEMCALDigitizer::Print(Option_t*)const
696 // Print Digitizer's parameters
697 printf("Print: \n------------------- %s -------------", GetName() ) ;
698 if( strcmp(fEventFolderName.Data(), "") != 0 ){
699 printf(" Writing Digits to branch with title %s\n", fEventFolderName.Data()) ;
703 nStreams = GetNInputStreams() ;
711 for (index = 0 ; index < nStreams ; index++) {
712 TString tempo(fEventNames[index]) ;
714 if ((rl = AliRunLoader::GetRunLoader(tempo)) == 0)
715 rl = AliRunLoader::Open(fInputFileNames[index], tempo) ;
716 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(rl->GetDetectorLoader("EMCAL"));
717 TString fileName( emcalLoader->GetSDigitsFileName() ) ;
718 if ( fEventNames[index] != AliConfig::GetDefaultEventFolderName()) // only if not the default folder name
719 fileName = fileName.ReplaceAll(".root", "") + "_" + fEventNames[index] + ".root" ;
720 printf ("Adding SDigits from %s %s\n", fInputFileNames[index].Data(), fileName.Data()) ;
723 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
725 printf("\nWriting digits to %s", emcalLoader->GetDigitsFileName().Data()) ;
727 printf("\nWith following parameters:\n") ;
729 printf(" Electronics noise in EMC (fPinNoise) = %f\n", fPinNoise) ;
730 printf(" Threshold in EMC (fDigitThreshold) = %f\n", fDigitThreshold) ;
731 printf("---------------------------------------------------\n") ;
734 printf("Print: AliEMCALDigitizer not initialized") ;
737 //__________________________________________________________________
738 void AliEMCALDigitizer::PrintDigits(Option_t * option)
740 //utility method for printing digit information
742 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
743 TClonesArray * digits = emcalLoader->Digits() ;
744 TClonesArray * sdigits = emcalLoader->SDigits() ;
746 printf("\n #Digits: %d : sdigits %d ", digits->GetEntriesFast(), sdigits->GetEntriesFast()) ;
747 printf("\n event %d", emcalLoader->GetRunLoader()->GetEventNumber());
749 if(strstr(option,"all")){
751 AliEMCALDigit * digit;
752 printf("\nEMC digits (with primaries):\n") ;
753 printf("\n Id Amplitude Time Index Nprim: Primaries list \n") ;
755 for (index = 0 ; index < digits->GetEntries() ; index++) {
756 digit = dynamic_cast<AliEMCALDigit *>(digits->At(index)) ;
757 printf("\n%6d %8d %6.5e %4d %2d : ",
758 digit->GetId(), digit->GetAmp(), digit->GetTime(), digit->GetIndexInList(), digit->GetNprimary()) ;
760 for (iprimary=0; iprimary<digit->GetNprimary(); iprimary++) {
761 printf("%d ",digit->GetPrimary(iprimary+1) ) ;
768 //__________________________________________________________________
769 Float_t AliEMCALDigitizer::TimeOfNoise(void)
771 // Calculates the time signal generated by noise
772 //PH Info("TimeOfNoise", "Change me") ;
773 return gRandom->Rndm() * 1.28E-5;
776 //__________________________________________________________________
777 void AliEMCALDigitizer::Unload()
779 // Unloads the SDigits and Digits
783 for(i = 1 ; i < fInput ; i++){
784 TString tempo(fEventNames[i]) ;
786 if ((rl = AliRunLoader::GetRunLoader(tempo)))
787 rl->GetDetectorLoader("EMCAL")->UnloadSDigits() ;
789 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
790 emcalLoader->UnloadDigits() ;
793 //_________________________________________________________________________________________
794 void AliEMCALDigitizer::WriteDigits()
797 // Makes TreeD in the output file.
798 // Check if branch already exists:
799 // if yes, exit without writing: ROOT TTree does not support overwriting/updating of
800 // already existing branches.
801 // else creates branch with Digits, named "EMCAL", title "...",
802 // and branch "AliEMCALDigitizer", with the same title to keep all the parameters
803 // and names of files, from which digits are made.
805 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
807 const TClonesArray * digits = emcalLoader->Digits() ;
808 TTree * treeD = emcalLoader->TreeD();
810 emcalLoader->MakeDigitsContainer();
811 treeD = emcalLoader->TreeD();
814 // -- create Digits branch
815 Int_t bufferSize = 32000 ;
816 TBranch * digitsBranch = 0;
817 if ((digitsBranch = treeD->GetBranch("EMCAL")))
818 digitsBranch->SetAddress(&digits);
820 treeD->Branch("EMCAL","TClonesArray",&digits,bufferSize);
821 //digitsBranch->SetTitle(fEventFolderName);
824 emcalLoader->WriteDigits("OVERWRITE");
825 emcalLoader->WriteDigitizer("OVERWRITE");
831 void AliEMCALDigitizer::Browse(TBrowser* b)
833 if(fHists) b->Add(fHists);
837 TList *AliEMCALDigitizer::BookControlHists(int var)
840 // histograms for monitoring digitizer performance
842 Info("BookControlHists"," started ");
844 const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
846 new TH1F("hDigiN", "#EMCAL digits with fAmp > fDigitThreshold",
847 fNADCEC+1, -0.5, Double_t(fNADCEC));
848 new TH1F("HDigiSumEnergy","Sum.EMCAL energy from digi", 1000, 0.0, 200.);
849 new TH1F("hDigiAmp", "EMCAL digital amplitude", fNADCEC+1, -0.5, Double_t(fNADCEC));
850 new TH1F("hDigiEnergy","EMCAL cell energy", 2000, 0.0, 200.);
851 new TH1F("hDigiAbsId","EMCAL absId cells with fAmp > fDigitThreshold ",
852 geom->GetNCells(), 0.5, Double_t(geom->GetNCells())+0.5);
855 fHists = AliEMCALHistoUtilities::MoveHistsToList("EmcalDigiControlHists", kFALSE);
856 fHists = 0; //huh? JLK 03-Mar-2006
860 void AliEMCALDigitizer::SaveHists(const char* name, Bool_t kSingleKey, const char* opt)
862 AliEMCALHistoUtilities::SaveListOfHists(fHists, name, kSingleKey, opt);