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>
72 // --- AliRoot header files ---
75 #include "AliRunDigitizer.h"
76 #include "AliRunLoader.h"
77 #include "AliCDBManager.h"
78 #include "AliCDBEntry.h"
79 #include "AliEMCALDigit.h"
81 #include "AliEMCALLoader.h"
82 #include "AliEMCALDigitizer.h"
83 #include "AliEMCALSDigitizer.h"
84 #include "AliEMCALGeometry.h"
85 #include "AliEMCALTick.h"
86 #include "AliEMCALHistoUtilities.h"
88 ClassImp(AliEMCALDigitizer)
91 //____________________________________________________________________________
92 AliEMCALDigitizer::AliEMCALDigitizer()
93 : AliDigitizer("",""),
101 fMeanPhotonElectron(0),
107 fTimeSignalLength(0),
111 fEventFolderName(""),
115 fHists(0),fCalibData(0x0)
119 fManager = 0 ; // We work in the standalong mode
122 //____________________________________________________________________________
123 AliEMCALDigitizer::AliEMCALDigitizer(TString alirunFileName, TString eventFolderName)
124 : AliDigitizer("EMCAL"+AliConfig::Instance()->GetDigitizerTaskName(), alirunFileName),
125 fDefaultInit(kFALSE),
132 fMeanPhotonElectron(0),
138 fTimeSignalLength(0),
142 fEventFolderName(eventFolderName),
151 fManager = 0 ; // We work in the standalong mode
154 //____________________________________________________________________________
155 AliEMCALDigitizer::AliEMCALDigitizer(const AliEMCALDigitizer & d)
156 : AliDigitizer(d.GetName(),d.GetTitle()),
157 fDefaultInit(d.fDefaultInit),
158 fDigitsInRun(d.fDigitsInRun),
161 fInputFileNames(d.fInputFileNames),
162 fEventNames(d.fEventNames),
163 fDigitThreshold(d.fDigitThreshold),
164 fMeanPhotonElectron(d.fMeanPhotonElectron),
165 fPedestal(d.fPedestal),
167 fPinNoise(d.fPinNoise),
168 fTimeResolution(d.fTimeResolution),
169 fTimeThreshold(d.fTimeThreshold),
170 fTimeSignalLength(d.fTimeSignalLength),
171 fADCchannelEC(d.fADCchannelEC),
172 fADCpedestalEC(d.fADCpedestalEC),
174 fEventFolderName(d.fEventFolderName),
175 fFirstEvent(d.fFirstEvent),
176 fLastEvent(d.fLastEvent),
177 fControlHists(d.fControlHists),
178 fHists(d.fHists),fCalibData(d.fCalibData)
183 //____________________________________________________________________________
184 AliEMCALDigitizer::AliEMCALDigitizer(AliRunDigitizer * rd)
185 : AliDigitizer(rd,"EMCAL"+AliConfig::Instance()->GetDigitizerTaskName()),
186 fDefaultInit(kFALSE),
193 fMeanPhotonElectron(0),
199 fTimeSignalLength(0),
209 // ctor Init() is called by RunDigitizer
211 fEventFolderName = fManager->GetInputFolderName(0) ;
212 SetTitle(dynamic_cast<AliStream*>(fManager->GetInputStream(0))->GetFileName(0));
216 //____________________________________________________________________________
217 AliEMCALDigitizer::~AliEMCALDigitizer()
220 if (AliRunLoader::GetRunLoader()) {
221 AliLoader *emcalLoader=0;
222 if ((emcalLoader = AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL")))
223 emcalLoader->CleanDigitizer();
226 AliDebug(1," no runloader present");
227 delete [] fInputFileNames ;
228 delete [] fEventNames ;
230 if(fHists) delete fHists;
233 //____________________________________________________________________________
234 void AliEMCALDigitizer::Digitize(Int_t event)
237 // Makes the digitization of the collected summable digits
238 // for this it first creates the array of all EMCAL modules
239 // filled with noise (different for EMC, CPV and PPSD) and
240 // after that adds contributions from SDigits. This design
241 // helps to avoid scanning over the list of digits to add
242 // contribution of any new SDigit.
243 static int isTrd1Geom = -1; // -1 - mean undefined
244 static int nEMC=0; //max number of digits possible
246 AliRunLoader *rl = AliRunLoader::GetRunLoader();
247 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(rl->GetDetectorLoader("EMCAL"));
248 Int_t readEvent = event ;
249 // fManager is data member from AliDigitizer
251 readEvent = dynamic_cast<AliStream*>(fManager->GetInputStream(0))->GetCurrentEventNumber() ;
252 AliDebug(1,Form("Adding event %d from input stream 0 %s %s",
253 readEvent, GetTitle(), fEventFolderName.Data())) ;
254 rl->GetEvent(readEvent);
256 TClonesArray * digits = emcalLoader->Digits() ;
260 AliEMCALGeometry *geom = 0;
261 if (rl->GetAliRun()) {
262 AliEMCAL * emcal = (AliEMCAL*)rl->GetAliRun()->GetDetector("EMCAL");
263 geom = emcal->GetGeometry();
266 AliFatal("Could not get AliRun from runLoader");
269 AliInfo(Form(" get Geometry %s : %s ", geom->GetName(),geom->GetTitle()));
270 TString ng(geom->GetName());
272 if(ng.Contains("SHISH") && ng.Contains("TRD1")) isTrd1Geom = 1;
274 if(isTrd1Geom == 0) nEMC = geom->GetNPhi()*geom->GetNZ();
275 else nEMC = geom->GetNCells();
276 AliDebug(1,Form("nEMC %i (number cells in EMCAL) | %s | isTrd1Geom %i\n", nEMC, geom->GetName(), isTrd1Geom));
280 digits->Expand(nEMC) ;
282 // get first the sdigitizer from the tasks list (must have same name as the digitizer)
283 if ( !emcalLoader->SDigitizer() )
284 emcalLoader->LoadSDigitizer();
285 AliEMCALSDigitizer * sDigitizer = dynamic_cast<AliEMCALSDigitizer*>(emcalLoader->SDigitizer());
288 Fatal("Digitize", "SDigitizer with name %s %s not found", fEventFolderName.Data(), GetTitle() ) ;
290 //take all the inputs to add together and load the SDigits
291 TObjArray * sdigArray = new TObjArray(fInput) ;
292 sdigArray->AddAt(emcalLoader->SDigits(), 0) ;
295 for(i = 1 ; i < fInput ; i++){
296 TString tempo(fEventNames[i]) ;
299 AliRunLoader * rl2 = AliRunLoader::GetRunLoader(tempo) ;
302 rl2 = AliRunLoader::Open(fInputFileNames[i], tempo) ;
305 readEvent = dynamic_cast<AliStream*>(fManager->GetInputStream(i))->GetCurrentEventNumber() ;
306 Info("Digitize", "Adding event %d from input stream %d %s %s", readEvent, i, fInputFileNames[i].Data(), tempo.Data()) ;
308 rl2->GetEvent(readEvent);
309 AliEMCALLoader *emcalLoader2 = dynamic_cast<AliEMCALLoader*>(rl2->GetDetectorLoader("EMCAL"));
310 sdigArray->AddAt(emcalLoader2->SDigits(), i) ;
313 //Find the first tower with signal
314 Int_t nextSig = nEMC + 1 ;
315 TClonesArray * sdigits ;
316 for(i = 0 ; i < fInput ; i++){
317 sdigits = dynamic_cast<TClonesArray *>(sdigArray->At(i)) ;
318 if ( !sdigits->GetEntriesFast() )
320 Int_t curNext = dynamic_cast<AliEMCALDigit *>(sdigits->At(0))->GetId() ;
321 if(curNext < nextSig)
323 AliDebug(1,Form("input %i : #sdigits %i \n",
324 i, sdigits->GetEntriesFast()));
326 AliDebug(1,Form("FIRST tower with signal %i \n", nextSig));
328 TArrayI index(fInput) ;
329 index.Reset() ; //Set all indexes to zero
331 AliEMCALDigit * digit ;
332 AliEMCALDigit * curSDigit ;
334 TClonesArray * ticks = new TClonesArray("AliEMCALTick",1000) ;
336 //Put Noise contribution
337 for(absID = 0; absID < nEMC; absID++){ // Nov 30, 2006 by PAI; was from 1 to nEMC
339 // amplitude set to zero, noise will be added later
340 new((*digits)[absID]) AliEMCALDigit( -1, -1, absID, 0, TimeOfNoise() ); // absID-1->absID
341 //look if we have to add signal?
342 digit = dynamic_cast<AliEMCALDigit *>(digits->At(absID)); // absID-1->absID
345 //Add SDigits from all inputs
348 Float_t a = digit->GetAmp() ;
349 Float_t b = TMath::Abs( a /fTimeSignalLength) ;
350 //Mark the beginning of the signal
351 new((*ticks)[contrib++]) AliEMCALTick(digit->GetTime(),0, b);
352 //Mark the end of the signal
353 new((*ticks)[contrib++]) AliEMCALTick(digit->GetTime()+fTimeSignalLength, -a, -b);
356 for(i = 0; i< fInput ; i++){ //loop over (possible) merge sources
357 if(dynamic_cast<TClonesArray *>(sdigArray->At(i))->GetEntriesFast() > index[i] )
358 curSDigit = dynamic_cast<AliEMCALDigit*>(dynamic_cast<TClonesArray *>(sdigArray->At(i))->At(index[i])) ;
361 //May be several digits will contribute from the same input
362 while(curSDigit && (curSDigit->GetId() == absID)){
363 //Shift primary to separate primaries belonging different inputs
364 Int_t primaryoffset ;
366 primaryoffset = fManager->GetMask(i) ;
369 curSDigit->ShiftPrimary(primaryoffset) ;
371 a = curSDigit->GetAmp() ;
372 b = a /fTimeSignalLength ;
373 new((*ticks)[contrib++]) AliEMCALTick(curSDigit->GetTime(),0, b);
374 new((*ticks)[contrib++]) AliEMCALTick(curSDigit->GetTime()+fTimeSignalLength, -a, -b);
376 *digit = *digit + *curSDigit ; //add energies
379 if( dynamic_cast<TClonesArray *>(sdigArray->At(i))->GetEntriesFast() > index[i] )
380 curSDigit = dynamic_cast<AliEMCALDigit*>(dynamic_cast<TClonesArray *>(sdigArray->At(i))->At(index[i])) ;
385 // add fluctuations for photo-electron creation
386 amp = sDigitizer->Calibrate(digit->GetAmp()) ; // GeV
387 amp *= static_cast<Float_t>(gRandom->Poisson(fMeanPhotonElectron)) / static_cast<Float_t>(fMeanPhotonElectron) ;
389 //calculate and set time
390 Float_t time = FrontEdgeTime(ticks) ;
391 digit->SetTime(time) ;
393 //Find next signal module
395 for(i = 0 ; i < fInput ; i++){
396 sdigits = dynamic_cast<TClonesArray *>(sdigArray->At(i)) ;
397 Int_t curNext = nextSig ;
398 if(sdigits->GetEntriesFast() > index[i] ){
399 curNext = dynamic_cast<AliEMCALDigit *>(sdigits->At(index[i]))->GetId() ;
401 if(curNext < nextSig) nextSig = curNext ;
405 amp += TMath::Abs(gRandom->Gaus(0., fPinNoise)) ;
406 digit->SetAmp(sDigitizer->Digitize(amp)) ;
407 AliDebug(10,Form(" absID %5i amp %f nextSig %5i\n",
408 absID, amp, nextSig));
409 } // for(absID = 1; absID <= nEMC; absID++)
414 delete sdigArray ; //We should not delete its contents
416 //remove digits below thresholds
417 for(i = 0 ; i < nEMC ; i++){
418 digit = dynamic_cast<AliEMCALDigit*>( digits->At(i) ) ;
419 Float_t threshold = fDigitThreshold ;
420 if(sDigitizer->Calibrate( digit->GetAmp() ) < threshold)
421 digits->RemoveAt(i) ;
423 digit->SetTime(gRandom->Gaus(digit->GetTime(),fTimeResolution) ) ;
428 Int_t ndigits = digits->GetEntriesFast() ;
430 //Set indexes in list of digits and fill hists.
431 AliEMCALHistoUtilities::FillH1(fHists, 0, Double_t(ndigits));
432 Float_t energy=0., esum=0.;
433 for (i = 0 ; i < ndigits ; i++) {
434 digit = dynamic_cast<AliEMCALDigit *>( digits->At(i) ) ;
435 digit->SetIndexInList(i) ;
436 energy = sDigitizer->Calibrate(digit->GetAmp()) ;
438 digit->SetAmp(DigitizeEnergy(energy, digit->GetId()) ) ; // for what ??
439 AliEMCALHistoUtilities::FillH1(fHists, 2, double(digit->GetAmp()));
440 AliEMCALHistoUtilities::FillH1(fHists, 3, double(energy));
441 AliEMCALHistoUtilities::FillH1(fHists, 4, double(digit->GetId()));
442 // if(digit->GetId() == nEMC) {
443 // printf(" i %i \n", i );
448 AliEMCALHistoUtilities::FillH1(fHists, 1, esum);
451 // //_____________________________________________________________________
452 Int_t AliEMCALDigitizer::DigitizeEnergy(Float_t energy, Int_t AbsId)
454 // Returns digitized value of the energy in a cell absId
457 const AliEMCALGeometry * geom = AliEMCALGeometry::GetInstance();
460 AliFatal("Did not get geometry from EMCALLoader");
468 Int_t channel = -999;
470 Bool_t bCell = geom->GetCellIndex(AbsId, iSupMod, nModule, nIphi, nIeta) ;
472 Error("DigitizeEnergy","Wrong cell id number : AbsId %i ", AbsId) ;
473 geom->GetCellPhiEtaIndexInSModule(iSupMod,nModule,nIphi, nIeta,iphi,ieta);
476 fADCpedestalEC = fCalibData->GetADCpedestal(iSupMod,ieta,iphi);
477 fADCchannelEC = fCalibData->GetADCchannel(iSupMod,ieta,iphi);
480 channel = static_cast<Int_t> (TMath::Ceil( (energy + fADCpedestalEC)/fADCchannelEC )) ;
482 if(channel > fNADCEC )
488 //____________________________________________________________________________
489 void AliEMCALDigitizer::Exec(Option_t *option)
491 // Steering method to process digitization for events
492 // in the range from fFirstEvent to fLastEvent.
493 // This range is optionally set by SetEventRange().
494 // if fLastEvent=-1, then process events until the end.
495 // by default fLastEvent = fFirstEvent (process only one event)
497 if (!fInit) { // to prevent overwrite existing file
498 Error( "Exec", "Give a version name different from %s", fEventFolderName.Data() ) ;
502 if (strstr(option,"print")) {
508 if(strstr(option,"tim"))
509 gBenchmark->Start("EMCALDigitizer");
511 AliRunLoader *rl = AliRunLoader::GetRunLoader();
512 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(rl->GetDetectorLoader("EMCAL"));
514 // Post Digitizer to the white board
515 emcalLoader->PostDigitizer(this) ;
517 if (fLastEvent == -1) {
518 fLastEvent = rl->GetNumberOfEvents() - 1 ;
521 fLastEvent = fFirstEvent ; // what is this ??
523 Int_t nEvents = fLastEvent - fFirstEvent + 1;
526 rl->LoadSDigits("EMCAL");
527 for (ievent = fFirstEvent; ievent <= fLastEvent; ievent++) {
529 rl->GetEvent(ievent);
531 Digitize(ievent) ; //Add prepared SDigits to digits and add the noise
535 if(strstr(option,"deb"))
537 if(strstr(option,"table")) gObjectTable->Print();
539 //increment the total number of Digits per run
540 fDigitsInRun += emcalLoader->Digits()->GetEntriesFast() ;
543 emcalLoader->CleanDigitizer() ;
545 if(strstr(option,"tim")){
546 gBenchmark->Stop("EMCALDigitizer");
547 AliInfo(Form("Exec: took %f seconds for Digitizing %f seconds per event",
548 gBenchmark->GetCpuTime("EMCALDigitizer"), gBenchmark->GetCpuTime("EMCALDigitizer")/nEvents )) ;
552 //____________________________________________________________________________
553 Float_t AliEMCALDigitizer::FrontEdgeTime(TClonesArray * ticks)
555 // Returns the shortest time among all time ticks
557 ticks->Sort() ; //Sort in accordance with times of ticks
559 AliEMCALTick * ctick = (AliEMCALTick *) it.Next() ;
560 Float_t time = ctick->CrossingTime(fTimeThreshold) ;
563 while((t=(AliEMCALTick*) it.Next())){
564 if(t->GetTime() < time) //This tick starts before crossing
569 time = ctick->CrossingTime(fTimeThreshold) ;
574 //____________________________________________________________________________
575 Bool_t AliEMCALDigitizer::Init()
577 // Makes all memory allocations
579 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
581 if ( emcalLoader == 0 ) {
582 Fatal("Init", "Could not obtain the AliEMCALLoader");
587 fLastEvent = fFirstEvent ;
590 fInput = fManager->GetNinputs() ;
594 fInputFileNames = new TString[fInput] ;
595 fEventNames = new TString[fInput] ;
596 fInputFileNames[0] = GetTitle() ;
597 fEventNames[0] = fEventFolderName.Data() ;
599 for (index = 1 ; index < fInput ; index++) {
600 fInputFileNames[index] = dynamic_cast<AliStream*>(fManager->GetInputStream(index))->GetFileName(0);
601 TString tempo = fManager->GetInputFolderName(index) ;
602 fEventNames[index] = tempo.Remove(tempo.Length()-1) ; // strip of the stream number added bt fManager
605 //to prevent cleaning of this object while GetEvent is called
606 emcalLoader->GetDigitsDataLoader()->GetBaseTaskLoader()->SetDoNotReload(kTRUE);
609 //Calibration instance
610 fCalibData = emcalLoader->CalibData();
614 //____________________________________________________________________________
615 void AliEMCALDigitizer::InitParameters()
617 // Parameter initialization for digitizer
618 // Tune parameters - 24-nov-04; Apr 29, 2007
620 fMeanPhotonElectron = 3300; // electrons per GeV
621 fPinNoise = 0.010; // pin noise in GEV from analysis test beam data
622 if (fPinNoise == 0. )
623 Warning("InitParameters", "No noise added\n") ;
624 fDigitThreshold = fPinNoise * 3; // 3 * sigma
625 fTimeResolution = 0.3e-9 ; // 300 psc
626 fTimeSignalLength = 1.0e-9 ;
628 // These defaults are normally not used.
629 // Values are read from calibration database instead
630 fADCchannelEC = 0.0153; // Update 24 Apr 2007: 250./16/1024 - width of one ADC channel in GeV
631 fADCpedestalEC = 0.0 ; // GeV
632 fNADCEC = (Int_t) TMath::Power(2,16) ; // number of channels in Tower ADC - 65536
634 fTimeThreshold = 0.001*10000000 ; // Means 1 MeV in terms of SDigits amplitude ??
635 // hists. for control; no hists on default
640 //__________________________________________________________________
641 void AliEMCALDigitizer::MixWith(TString alirunFileName, TString eventFolderName)
643 // Allows to produce digits by superimposing background and signal event.
644 // It is assumed, that headers file with SIGNAL events is opened in
646 // Sets the BACKGROUND event, with which the SIGNAL event is to be mixed
647 // Thus we avoid writing (changing) huge and expensive
648 // backgound files: all output will be writen into SIGNAL, i.e.
649 // opened in constructor file.
651 // One can open as many files to mix with as one needs.
652 // However only Sdigits with the same name (i.e. constructed with the same SDigitizer)
655 if( strcmp(GetName(), "") == 0 )
659 Error("MixWith", "Cannot use this method under AliRunDigitizer") ;
662 // looking for file which contains AliRun
663 if (gSystem->AccessPathName(alirunFileName)) {// file does not exist
664 Error("MixWith", "File %s does not exist!", alirunFileName.Data()) ;
667 // looking for the file which contains SDigits
668 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
669 TString fileName( emcalLoader->GetSDigitsFileName() ) ;
670 if ( eventFolderName != AliConfig::GetDefaultEventFolderName()) // only if not the default folder name
671 fileName = fileName.ReplaceAll(".root", "") + "_" + eventFolderName + ".root" ;
672 if ( (gSystem->AccessPathName(fileName)) ) {
673 Error("MixWith", "The file %s does not exist!", fileName.Data()) ;
676 // need to increase the arrays
677 // MvL: This code only works when fInput == 1, I think.
678 TString tempo = fInputFileNames[fInput-1] ;
679 delete [] fInputFileNames ;
680 fInputFileNames = new TString[fInput+1] ;
681 fInputFileNames[fInput-1] = tempo ;
683 tempo = fEventNames[fInput-1] ;
684 delete [] fEventNames ;
685 fEventNames = new TString[fInput+1] ;
686 fEventNames[fInput-1] = tempo ;
688 fInputFileNames[fInput] = alirunFileName ;
689 fEventNames[fInput] = eventFolderName ;
693 void AliEMCALDigitizer::Print1(Option_t * option)
694 { // 19-nov-04 - just for convinience
699 //__________________________________________________________________
700 void AliEMCALDigitizer::Print(Option_t*)const
702 // Print Digitizer's parameters
703 printf("Print: \n------------------- %s -------------", GetName() ) ;
704 if( strcmp(fEventFolderName.Data(), "") != 0 ){
705 printf(" Writing Digits to branch with title %s\n", fEventFolderName.Data()) ;
709 nStreams = GetNInputStreams() ;
717 for (index = 0 ; index < nStreams ; index++) {
718 TString tempo(fEventNames[index]) ;
720 if ((rl = AliRunLoader::GetRunLoader(tempo)) == 0)
721 rl = AliRunLoader::Open(fInputFileNames[index], tempo) ;
722 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(rl->GetDetectorLoader("EMCAL"));
723 TString fileName( emcalLoader->GetSDigitsFileName() ) ;
724 if ( fEventNames[index] != AliConfig::GetDefaultEventFolderName()) // only if not the default folder name
725 fileName = fileName.ReplaceAll(".root", "") + "_" + fEventNames[index] + ".root" ;
726 printf ("Adding SDigits from %s %s\n", fInputFileNames[index].Data(), fileName.Data()) ;
729 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
731 printf("\nWriting digits to %s", emcalLoader->GetDigitsFileName().Data()) ;
733 printf("\nWith following parameters:\n") ;
735 printf(" Electronics noise in EMC (fPinNoise) = %f\n", fPinNoise) ;
736 printf(" Threshold in EMC (fDigitThreshold) = %f\n", fDigitThreshold) ;
737 printf("---------------------------------------------------\n") ;
740 printf("Print: AliEMCALDigitizer not initialized") ;
743 //__________________________________________________________________
744 void AliEMCALDigitizer::PrintDigits(Option_t * option)
746 //utility method for printing digit information
748 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
749 TClonesArray * digits = emcalLoader->Digits() ;
750 TClonesArray * sdigits = emcalLoader->SDigits() ;
752 printf("\n #Digits: %d : sdigits %d ", digits->GetEntriesFast(), sdigits->GetEntriesFast()) ;
753 printf("\n event %d", emcalLoader->GetRunLoader()->GetEventNumber());
755 if(strstr(option,"all")){
757 AliEMCALDigit * digit;
758 printf("\nEMC digits (with primaries):\n") ;
759 printf("\n Id Amplitude Time Index Nprim: Primaries list \n") ;
761 for (index = 0 ; index < digits->GetEntries() ; index++) {
762 digit = dynamic_cast<AliEMCALDigit *>(digits->At(index)) ;
763 printf("\n%6d %8d %6.5e %4d %2d : ",
764 digit->GetId(), digit->GetAmp(), digit->GetTime(), digit->GetIndexInList(), digit->GetNprimary()) ;
766 for (iprimary=0; iprimary<digit->GetNprimary(); iprimary++) {
767 printf("%d ",digit->GetPrimary(iprimary+1) ) ;
774 //__________________________________________________________________
775 Float_t AliEMCALDigitizer::TimeOfNoise(void)
777 // Calculates the time signal generated by noise
778 //PH Info("TimeOfNoise", "Change me") ;
779 return gRandom->Rndm() * 1.28E-5;
782 //__________________________________________________________________
783 void AliEMCALDigitizer::Unload()
785 // Unloads the SDigits and Digits
789 for(i = 1 ; i < fInput ; i++){
790 TString tempo(fEventNames[i]) ;
792 if ((rl = AliRunLoader::GetRunLoader(tempo)))
793 rl->GetDetectorLoader("EMCAL")->UnloadSDigits() ;
795 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
796 emcalLoader->UnloadDigits() ;
799 //_________________________________________________________________________________________
800 void AliEMCALDigitizer::WriteDigits()
803 // Makes TreeD in the output file.
804 // Check if branch already exists:
805 // if yes, exit without writing: ROOT TTree does not support overwriting/updating of
806 // already existing branches.
807 // else creates branch with Digits, named "EMCAL", title "...",
808 // and branch "AliEMCALDigitizer", with the same title to keep all the parameters
809 // and names of files, from which digits are made.
811 AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::GetRunLoader()->GetDetectorLoader("EMCAL"));
813 const TClonesArray * digits = emcalLoader->Digits() ;
814 TTree * treeD = emcalLoader->TreeD();
816 emcalLoader->MakeDigitsContainer();
817 treeD = emcalLoader->TreeD();
820 // -- create Digits branch
821 Int_t bufferSize = 32000 ;
822 TBranch * digitsBranch = 0;
823 if ((digitsBranch = treeD->GetBranch("EMCAL"))) {
824 digitsBranch->SetAddress(&digits);
825 AliWarning("Digits Branch already exists. Not all digits will be visible");
828 treeD->Branch("EMCAL","TClonesArray",&digits,bufferSize);
829 //digitsBranch->SetTitle(fEventFolderName);
832 emcalLoader->WriteDigits("OVERWRITE");
833 emcalLoader->WriteDigitizer("OVERWRITE");
839 void AliEMCALDigitizer::Browse(TBrowser* b)
841 if(fHists) b->Add(fHists);
845 TList *AliEMCALDigitizer::BookControlHists(int var)
848 // histograms for monitoring digitizer performance
850 Info("BookControlHists"," started ");
852 const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
854 new TH1F("hDigiN", "#EMCAL digits with fAmp > fDigitThreshold",
855 fNADCEC+1, -0.5, Double_t(fNADCEC));
856 new TH1F("HDigiSumEnergy","Sum.EMCAL energy from digi", 1000, 0.0, 200.);
857 new TH1F("hDigiAmp", "EMCAL digital amplitude", fNADCEC+1, -0.5, Double_t(fNADCEC));
858 new TH1F("hDigiEnergy","EMCAL cell energy", 2000, 0.0, 200.);
859 new TH1F("hDigiAbsId","EMCAL absId cells with fAmp > fDigitThreshold ",
860 geom->GetNCells(), 0.5, Double_t(geom->GetNCells())+0.5);
863 fHists = AliEMCALHistoUtilities::MoveHistsToList("EmcalDigiControlHists", kFALSE);
864 fHists = 0; //huh? JLK 03-Mar-2006
868 void AliEMCALDigitizer::SaveHists(const char* name, Bool_t kSingleKey, const char* opt)
870 AliEMCALHistoUtilities::SaveListOfHists(fHists, name, kSingleKey, opt);