// must call the Calibrate() method of the SDigitizer to convert it
// back to an energy in GeV before adding it to the Digit
//
- static int nEMC=0; //max number of digits possible
+
AliRunLoader *rl = AliRunLoader::Instance();
AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(rl->GetDetectorLoader("EMCAL"));
- if(emcalLoader)
+ if(!emcalLoader)
{
- Int_t readEvent = event ;
- // fDigInput is data member from AliDigitizer
- if (fDigInput)
+ AliFatal("EMCALLoader is NULL!") ;
+ return; // not needed but in case coverity complains ...
+ }
+
+ Int_t readEvent = event ;
+ if (fDigInput) // fDigInput is data member from AliDigitizer
readEvent = dynamic_cast<AliStream*>(fDigInput->GetInputStream(0))->GetCurrentEventNumber() ;
- AliDebug(1,Form("Adding event %d from input stream 0 %s %s",
- readEvent, GetTitle(), fEventFolderName.Data())) ;
- rl->GetEvent(readEvent);
+ AliDebug(1,Form("Adding event %d from input stream 0 %s %s",
+ readEvent, GetTitle(), fEventFolderName.Data())) ;
+ rl->GetEvent(readEvent);
+
+ TClonesArray * digits = emcalLoader->Digits() ;
+ digits->Delete() ; //correct way to clear array when memory is
+ //allocated by objects stored in array
+
+ // Load Geometry
+ if (!rl->GetAliRun())
+ {
+ AliFatal("Could not get AliRun from runLoader");
+ return; // not needed but in case coverity complains ...
+ }
+
+ AliEMCAL * emcal = (AliEMCAL*)rl->GetAliRun()->GetDetector("EMCAL");
+ AliEMCALGeometry *geom = emcal->GetGeometry();
+ static int nEMC = geom->GetNCells();//max number of digits possible
+ AliDebug(1,Form("nEMC %i (number cells in EMCAL) | %s \n", nEMC, geom->GetName()));
+
+ digits->Expand(nEMC) ;
+
+ // RS create a digitizer on the fly
+ if (!fSDigitizer) fSDigitizer = new AliEMCALSDigitizer(rl->GetFileName().Data());
+ fSDigitizer->SetEventRange(0, -1) ;
+
+ //-------------------------------------------------------
+ //take all the inputs to add together and load the SDigits
+ TObjArray * sdigArray = new TObjArray(fInput) ;
+ sdigArray->AddAt(emcalLoader->SDigits(), 0) ;
+
+ Int_t i ;
+ Int_t embed = kFALSE;
+ for(i = 1 ; i < fInput ; i++)
+ {
+ TString tempo(fEventNames[i]) ;
+ tempo += i ;
- TClonesArray * digits = emcalLoader->Digits() ;
- digits->Delete() ; //correct way to clear array when memory is
- //allocated by objects stored in array
+ AliRunLoader * rl2 = AliRunLoader::GetRunLoader(tempo) ;
- // Load Geometry
- AliEMCALGeometry *geom = 0;
- if (!rl->GetAliRun())
+ if (!rl2)
+ rl2 = AliRunLoader::Open(fInputFileNames[i], tempo) ;
+
+ if(!rl2)
{
- AliFatal("Could not get AliRun from runLoader");
+ AliFatal("Run Loader of second event not available!");
+ return; // not needed but in case coverity complains ...
}
- else{
- AliEMCAL * emcal = (AliEMCAL*)rl->GetAliRun()->GetDetector("EMCAL");
- geom = emcal->GetGeometry();
- nEMC = geom->GetNCells();
- AliDebug(1,Form("nEMC %i (number cells in EMCAL) | %s \n", nEMC, geom->GetName()));
+
+ if (fDigInput)
+ readEvent = dynamic_cast<AliStream*>(fDigInput->GetInputStream(i))->GetCurrentEventNumber() ;
+
+ Info("Digitize", "Adding event %d from input stream %d %s %s", readEvent, i, fInputFileNames[i].Data(), tempo.Data()) ;
+
+ rl2->LoadSDigits();
+ // rl2->LoadDigits();
+ rl2->GetEvent(readEvent);
+
+ if(!rl2->GetDetectorLoader("EMCAL"))
+ {
+ AliFatal("Loader of second input not found");
+ return; // not needed but in case coverity complains ...
}
- Int_t absID = -1 ;
+ AliEMCALLoader *emcalLoader2 = dynamic_cast<AliEMCALLoader*>(rl2->GetDetectorLoader("EMCAL"));
+
+ if(!emcalLoader2)
+ {
+ AliFatal("EMCAL Loader of second event not available!");
+ return; // not needed but in case coverity complains ...
+ }
+
+ //Merge 2 simulated sdigits
+ if(!emcalLoader2->SDigits()) continue;
+
+ TClonesArray* sdigits2 = emcalLoader2->SDigits();
+ sdigArray->AddAt(sdigits2, i) ;
+
+ // Check if first sdigit is of embedded type, if so, handle the sdigits differently:
+ // do not smear energy of embedded, do not add noise to any sdigits
+ if( sdigits2->GetEntriesFast() <= 0 ) continue;
- digits->Expand(nEMC) ;
+ //printf("Merged digit type: %d\n",dynamic_cast<AliEMCALDigit*> (sdigits2->At(0))->GetType());
+ AliEMCALDigit * digit2 = dynamic_cast<AliEMCALDigit*> (sdigits2->At(0));
+ if( digit2 && digit2->GetType()==AliEMCALDigit::kEmbedded ) embed = kTRUE;
- // RS create a digitizer on the fly
- if (!fSDigitizer) fSDigitizer = new AliEMCALSDigitizer(rl->GetFileName().Data());
- fSDigitizer->SetEventRange(0, -1) ;
- //
- //take all the inputs to add together and load the SDigits
- TObjArray * sdigArray = new TObjArray(fInput) ;
- sdigArray->AddAt(emcalLoader->SDigits(), 0) ;
- Int_t i ;
- Int_t embed = kFALSE;
- for(i = 1 ; i < fInput ; i++)
+ }// input loop
+
+ //--------------------------------
+ //Find the first tower with signal
+ Int_t nextSig = nEMC + 1 ;
+ TClonesArray * sdigits ;
+ for(i = 0 ; i < fInput ; i++)
+ {
+ if(i > 0 && embed) continue;
+
+ sdigits = dynamic_cast<TClonesArray *>(sdigArray->At(i)) ;
+ if(!sdigits)
{
- TString tempo(fEventNames[i]) ;
- tempo += i ;
-
- AliRunLoader * rl2 = AliRunLoader::GetRunLoader(tempo) ;
-
- if (rl2==0)
- rl2 = AliRunLoader::Open(fInputFileNames[i], tempo) ;
+ AliDebug(1,"Null sdigit pointer");
+ continue;
+ }
+
+ if (sdigits->GetEntriesFast() <= 0 )
+ {
+ AliDebug(1, "No sdigits entries");
+ continue;
+ }
+
+ AliEMCALDigit *sd = dynamic_cast<AliEMCALDigit *>(sdigits->At(0));
+ if(!sd)
+ {
+ AliDebug(1, "NULL sdigit pointer");
+ continue;
+ }
+
+ Int_t curNext = sd->GetId() ;
+ if(curNext < nextSig)
+ nextSig = curNext ;
+ AliDebug(1,Form("input %i : #sdigits %i \n",i, sdigits->GetEntriesFast()));
+
+ }// input loop
+
+ AliDebug(1,Form("FIRST tower with signal %i \n", nextSig));
+
+ TArrayI index(fInput) ;
+ index.Reset() ; //Set all indexes to zero
+
+ AliEMCALDigit * digit ;
+ AliEMCALDigit * curSDigit ;
+
+ //---------------------------------------------
+ //Put Noise contribution, smear time and energy
+ Float_t timeResolution = 0;
+ Int_t absID = -1 ;
+ for(absID = 0; absID < nEMC; absID++)
+ {
+ Float_t energy = 0 ;
+
+ // amplitude set to zero, noise will be added later
+ Float_t noiseTime = 0.;
+ if(!embed) noiseTime = TimeOfNoise(); //No need for embedded events?
+ new((*digits)[absID]) AliEMCALDigit( -1, -1, absID, 0., noiseTime,kFALSE); // absID-1->absID
+ //look if we have to add signal?
+ digit = dynamic_cast<AliEMCALDigit *>(digits->At(absID)); // absID-1->absID
+
+ if (!digit)
+ {
+ AliDebug(1,"Digit pointer is null");
+ continue;
+ }
+
+ if(absID==nextSig)
+ {
+ // Calculate time as time of the largest digit
+ Float_t time = digit->GetTime() ;
+ Float_t aTime= digit->GetAmplitude() ;
- if (fDigInput)
- readEvent = dynamic_cast<AliStream*>(fDigInput->GetInputStream(i))->GetCurrentEventNumber() ;
- Info("Digitize", "Adding event %d from input stream %d %s %s", readEvent, i, fInputFileNames[i].Data(), tempo.Data()) ;
- rl2->LoadSDigits();
- // rl2->LoadDigits();
- rl2->GetEvent(readEvent);
- if(rl2->GetDetectorLoader("EMCAL"))
+ // loop over input
+ Int_t nInputs = fInput;
+ if(embed) nInputs = 1; // In case of embedding, merge later real digits, do not smear energy and time of data
+ for(i = 0; i< nInputs ; i++)
{
- AliEMCALLoader *emcalLoader2 = dynamic_cast<AliEMCALLoader*>(rl2->GetDetectorLoader("EMCAL"));
-
- if(emcalLoader2)
+ //loop over (possible) merge sources
+ TClonesArray* sdtclarr = dynamic_cast<TClonesArray *>(sdigArray->At(i));
+ if(sdtclarr)
{
- //Merge 2 simulated sdigits
- if(emcalLoader2->SDigits()){
- TClonesArray* sdigits2 = emcalLoader2->SDigits();
- sdigArray->AddAt(sdigits2, i) ;
- // Check if first sdigit is of embedded type, if so, handle the sdigits differently:
- // do not smear energy of embedded, do not add noise to any sdigits
- if(sdigits2->GetEntriesFast()>0)
+ Int_t sDigitEntries = sdtclarr->GetEntriesFast();
+
+ if(sDigitEntries > index[i] ) curSDigit = dynamic_cast<AliEMCALDigit*>(sdtclarr->At(index[i])) ;
+ else curSDigit = 0 ;
+
+ //May be several digits will contribute from the same input
+ while(curSDigit && (curSDigit->GetId() == absID))
+ {
+ //Shift primary to separate primaries belonging different inputs
+ Int_t primaryoffset = i ;
+ if(fDigInput) primaryoffset = fDigInput->GetMask(i) ;
+ curSDigit->ShiftPrimary(primaryoffset) ;
+
+ if(curSDigit->GetAmplitude()>aTime)
{
- //printf("Merged digit type: %d\n",dynamic_cast<AliEMCALDigit*> (sdigits2->At(0))->GetType());
- AliEMCALDigit * digit2 = dynamic_cast<AliEMCALDigit*> (sdigits2->At(0));
- if( digit2 && digit2->GetType()==AliEMCALDigit::kEmbedded ) embed = kTRUE;
+ aTime = curSDigit->GetAmplitude();
+ time = curSDigit->GetTime();
}
- }
-
- }//loader2
- else AliFatal("EMCAL Loader of second event not available!");
-
- }
- else Fatal("Digitize", "Loader of second input not found");
- }// input loop
-
- //Find the first tower with signal
- Int_t nextSig = nEMC + 1 ;
- TClonesArray * sdigits ;
- for(i = 0 ; i < fInput ; i++){
- if(i > 0 && embed) continue;
- sdigits = dynamic_cast<TClonesArray *>(sdigArray->At(i)) ;
- if(sdigits)
+
+ *digit = *digit + *curSDigit ; //adds amplitudes of each digit
+
+ index[i]++ ;
+
+ if( sDigitEntries > index[i] ) curSDigit = dynamic_cast<AliEMCALDigit*>(sdtclarr->At(index[i])) ;
+ else curSDigit = 0 ;
+ }// while
+ }// source exists
+ }// loop over merging sources
+
+ //Here we convert the summed amplitude to an energy in GeV only for simulation or mixing of simulations
+ energy = fSDigitizer->Calibrate(digit->GetAmplitude()) ; // GeV
+
+ // add fluctuations for photo-electron creation
+ // corrected fluctuations after comparison with beam test, Paraskevi Ganoti (06/11/2011)
+ Float_t fluct = static_cast<Float_t>((energy*fMeanPhotonElectron)/fGainFluctuations);
+ energy *= static_cast<Float_t>(gRandom->Poisson(fluct)) / fluct ;
+
+ //calculate and set time
+ digit->SetTime(time) ;
+
+ //Find next signal module
+ nextSig = nEMC + 1 ;
+ for(i = 0 ; i < nInputs ; i++)
{
- if (sdigits->GetEntriesFast() )
+ sdigits = dynamic_cast<TClonesArray *>(sdigArray->At(i)) ;
+
+ if(sdigits)
{
- AliEMCALDigit *sd = dynamic_cast<AliEMCALDigit *>(sdigits->At(0));
- if(sd)
+ Int_t curNext = nextSig ;
+ if(sdigits->GetEntriesFast() > index[i])
{
- Int_t curNext = sd->GetId() ;
- if(curNext < nextSig)
- nextSig = curNext ;
- AliDebug(1,Form("input %i : #sdigits %i \n",
- i, sdigits->GetEntriesFast()));
-
- }//First entry is not NULL
- else
- {
- AliDebug(1, "NULL sdigit pointer");
- continue;
+ AliEMCALDigit * tmpdigit = dynamic_cast<AliEMCALDigit *>(sdigits->At(index[i]));
+ if ( tmpdigit ) curNext = tmpdigit->GetId() ;
}
- }//There is at least one entry
- else
- {
- AliDebug(1, "NULL sdigits array");
- continue;
- }
- }// SDigits array exists
- else
- {
- AliDebug(1,"Null sdigit pointer");
- continue;
- }
- }// input loop
- AliDebug(1,Form("FIRST tower with signal %i \n", nextSig));
+
+ if(curNext < nextSig) nextSig = curNext ;
+ }// sdigits exist
+ } // input loop
+
+ }//absID==nextSig
- TArrayI index(fInput) ;
- index.Reset() ; //Set all indexes to zero
+ // add the noise now, no need for embedded events with real data
+ if(!embed)
+ energy += gRandom->Gaus(0., fPinNoise) ;
- AliEMCALDigit * digit ;
- AliEMCALDigit * curSDigit ;
+ // JLK 26-June-2008
+ //Now digitize the energy according to the fSDigitizer method,
+ //which merely converts the energy to an integer. Later we will
+ //check that the stored value matches our allowed dynamic ranges
+ digit->SetAmplitude(fSDigitizer->Digitize(energy)) ;
- //Put Noise contribution, smear time and energy
- Float_t timeResolution = 0;
- for(absID = 0; absID < nEMC; absID++)
- { // Nov 30, 2006 by PAI; was from 1 to nEMC
-
- if (IsDead(absID)) continue; // Don't instantiate dead digits
-
- Float_t energy = 0 ;
-
- // amplitude set to zero, noise will be added later
- Float_t noiseTime = 0.;
- if(!embed) noiseTime = TimeOfNoise(); //No need for embedded events?
- new((*digits)[absID]) AliEMCALDigit( -1, -1, absID, 0., noiseTime,kFALSE); // absID-1->absID
- //look if we have to add signal?
- digit = dynamic_cast<AliEMCALDigit *>(digits->At(absID)); // absID-1->absID
+ //Set time resolution with final energy
+ timeResolution = GetTimeResolution(energy);
+ digit->SetTime(gRandom->Gaus(digit->GetTime(),timeResolution) ) ;
+ AliDebug(10,Form(" absID %5i energy %f nextSig %5i\n",
+ absID, energy, nextSig));
+ //Add delay to time
+ digit->SetTime(digit->GetTime()+fTimeDelay) ;
+
+ } // for(absID = 0; absID < nEMC; absID++)
+
+ //---------------------------------------------------------
+ //Embed simulated amplitude (and time?) to real data digits
+ if ( embed )
+ {
+ for(Int_t input = 1; input<fInput; input++)
+ {
+ TClonesArray *realDigits = dynamic_cast<TClonesArray*> (sdigArray->At(input));
+ if(!realDigits)
+ {
+ AliDebug(1,"No sdigits to merge\n");
+ continue;
+ }
- if (digit)
+ for(Int_t i2 = 0 ; i2 < realDigits->GetEntriesFast() ; i2++)
{
- if(absID==nextSig)
- {
- // Calculate time as time of the largest digit
- Float_t time = digit->GetTime() ;
- Float_t aTime= digit->GetAmplitude() ;
-
- // loop over input
- Int_t nInputs = fInput;
- if(embed) nInputs = 1; // In case of embedding, merge later real digits, do not smear energy and time of data
- for(i = 0; i< nInputs ; i++)
- { //loop over (possible) merge sources
- TClonesArray* sdtclarr = dynamic_cast<TClonesArray *>(sdigArray->At(i));
- if(sdtclarr) {
- Int_t sDigitEntries = sdtclarr->GetEntriesFast();
-
- if(sDigitEntries > index[i] )
- curSDigit = dynamic_cast<AliEMCALDigit*>(sdtclarr->At(index[i])) ;
- else
- curSDigit = 0 ;
-
- //May be several digits will contribute from the same input
- while(curSDigit && (curSDigit->GetId() == absID))
- {
- //Shift primary to separate primaries belonging different inputs
- Int_t primaryoffset ;
- if(fDigInput)
- primaryoffset = fDigInput->GetMask(i) ;
- else
- primaryoffset = i ;
- curSDigit->ShiftPrimary(primaryoffset) ;
-
- if(curSDigit->GetAmplitude()>aTime)
- {
- aTime = curSDigit->GetAmplitude();
- time = curSDigit->GetTime();
- }
-
- *digit = *digit + *curSDigit ; //adds amplitudes of each digit
-
- index[i]++ ;
-
- if( sDigitEntries > index[i] )
- curSDigit = dynamic_cast<AliEMCALDigit*>(sdtclarr->At(index[i])) ;
- else
- curSDigit = 0 ;
- }// while
- }// source exists
- }// loop over merging sources
-
-
- //Here we convert the summed amplitude to an energy in GeV only for simulation or mixing of simulations
- energy = fSDigitizer->Calibrate(digit->GetAmplitude()) ; // GeV
-
- // add fluctuations for photo-electron creation
- // corrected fluctuations after comparison with beam test, Paraskevi Ganoti (06/11/2011)
- Float_t fluct = static_cast<Float_t>((energy*fMeanPhotonElectron)/fGainFluctuations);
- energy *= static_cast<Float_t>(gRandom->Poisson(fluct)) / fluct ;
-
- //calculate and set time
- digit->SetTime(time) ;
-
- //Find next signal module
- nextSig = nEMC + 1 ;
- for(i = 0 ; i < nInputs ; i++){
- sdigits = dynamic_cast<TClonesArray *>(sdigArray->At(i)) ;
-
- if(sdigits){
- Int_t curNext = nextSig ;
- if(sdigits->GetEntriesFast() > index[i])
- {
- AliEMCALDigit * tmpdigit = dynamic_cast<AliEMCALDigit *>(sdigits->At(index[i]));
- if(tmpdigit)
- {
- curNext = tmpdigit->GetId() ;
- }
- }
- if(curNext < nextSig) nextSig = curNext ;
- }// sdigits exist
- } // input loop
-
- }//absID==nextSig
-
- // add the noise now, no need for embedded events with real data
- if(!embed)
- energy += gRandom->Gaus(0., fPinNoise) ;
+ AliEMCALDigit * digit2 = dynamic_cast<AliEMCALDigit*>( realDigits->At(i2) ) ;
+ if ( !digit2 ) continue;
+
+ digit = dynamic_cast<AliEMCALDigit*>( digits->At(digit2->GetId()) ) ;
+ if ( !digit ) continue;
+ // Put the embedded cell energy in same units as simulated sdigits -> transform to energy units
+ // and multiply to get a big int.
+ Float_t time2 = digit2->GetTime();
+ Float_t e2 = digit2->GetAmplitude();
+ CalibrateADCTime(e2,time2,digit2->GetId());
+ Float_t amp2 = fSDigitizer->Digitize(e2);
- // JLK 26-June-2008
- //Now digitize the energy according to the fSDigitizer method,
- //which merely converts the energy to an integer. Later we will
- //check that the stored value matches our allowed dynamic ranges
- digit->SetAmplitude(fSDigitizer->Digitize(energy)) ;
+ Float_t e0 = digit ->GetAmplitude();
+ if(e0>0.01)
+ AliDebug(1,Form("digit 1: Abs ID %d, amp %f, type %d, time %e; digit2: Abs ID %d, amp %f, type %d, time %e\n",
+ digit ->GetId(),digit ->GetAmplitude(), digit ->GetType(), digit->GetTime(),
+ digit2->GetId(),amp2, digit2->GetType(), time2 ));
- //Set time resolution with final energy
- timeResolution = GetTimeResolution(energy);
- digit->SetTime(gRandom->Gaus(digit->GetTime(),timeResolution) ) ;
- AliDebug(10,Form(" absID %5i energy %f nextSig %5i\n",
- absID, energy, nextSig));
- //Add delay to time
- digit->SetTime(digit->GetTime()+fTimeDelay) ;
+ // Sum amplitudes, change digit amplitude
+ digit->SetAmplitude( digit->GetAmplitude() + amp2);
- }// Digit pointer exists
- else AliDebug(1,"Digit pointer is null");
-
- } // for(absID = 0; absID < nEMC; absID++)
-
- //Embed simulated amplitude (and time?) to real data digits
- if(embed)
- {
- for(Int_t input = 1; input<fInput; input++)
- {
- TClonesArray *realDigits = dynamic_cast<TClonesArray*> (sdigArray->At(input));
- if(!realDigits)
- {
- AliDebug(1,"No sdigits to merge\n");
- continue;
- }
+ // Rough assumption, assign time of the largest of the 2 digits,
+ // data or signal to the final digit.
+ if(amp2 > digit->GetAmplitude()) digit->SetTime(time2);
- for(Int_t i2 = 0 ; i2 < realDigits->GetEntriesFast() ; i2++)
- {
- AliEMCALDigit * digit2 = dynamic_cast<AliEMCALDigit*>( realDigits->At(i2) ) ;
- if(digit2)
- {
- digit = dynamic_cast<AliEMCALDigit*>( digits->At(digit2->GetId()) ) ;
- if(digit)
- {
- // Put the embedded cell energy in same units as simulated sdigits -> transform to energy units
- // and multiply to get a big int.
- Float_t time2 = digit2->GetTime();
- Float_t e2 = digit2->GetAmplitude();
- CalibrateADCTime(e2,time2,digit2->GetId());
- Float_t amp2 = fSDigitizer->Digitize(e2);
-
- Float_t e0 = digit ->GetAmplitude();
- if(e0>0.01)
- AliDebug(1,Form("digit 1: Abs ID %d, amp %f, type %d, time %e; digit2: Abs ID %d, amp %f, type %d, time %e\n",
- digit ->GetId(),digit ->GetAmplitude(), digit ->GetType(), digit->GetTime(),
- digit2->GetId(),amp2, digit2->GetType(), time2 ));
-
- // Sum amplitudes, change digit amplitude
- digit->SetAmplitude( digit->GetAmplitude() + amp2);
- // Rough assumption, assign time of the largest of the 2 digits,
- // data or signal to the final digit.
- if(amp2 > digit->GetAmplitude()) digit->SetTime(time2);
- //Mark the new digit as embedded
- digit->SetType(AliEMCALDigit::kEmbedded);
-
- if(digit2->GetAmplitude()>0.01 && e0> 0.01 )
- AliDebug(1,Form("Embedded digit: Abs ID %d, amp %f, type %d\n",
- digit->GetId(), digit->GetAmplitude(), digit->GetType()));
- }//digit2
- }//digit2
- }//loop digit 2
- }//input loop
- }//embed
-
- //JLK is it better to call Clear() here?
- delete sdigArray ; //We should not delete its contents
-
- //remove digits below thresholds
- // until 10-02-2010 remove digits with energy smaller than fDigitThreshold 3*fPinNoise
- // now, remove digits with Digitized ADC smaller than fDigitThreshold = 3,
- // before merge in the same loop real data digits if available
- Float_t energy = 0;
- Float_t time = 0;
- for(i = 0 ; i < nEMC ; i++)
- {
- digit = dynamic_cast<AliEMCALDigit*>( digits->At(i) ) ;
- if(digit)
- {
- //Then get the energy in GeV units.
- energy = fSDigitizer->Calibrate(digit->GetAmplitude()) ;
- //Then digitize using the calibration constants of the ocdb
- Float_t ampADC = energy;
- DigitizeEnergyTime(ampADC, time, digit->GetId()) ;
- if(ampADC < fDigitThreshold)
- digits->RemoveAt(i) ;
+ //Mark the new digit as embedded
+ digit->SetType(AliEMCALDigit::kEmbedded);
- }// digit exists
- } // digit loop
+ if(digit2->GetAmplitude()>0.01 && e0> 0.01 )
+ AliDebug(1,Form("Embedded digit: Abs ID %d, amp %f, type %d\n",
+ digit->GetId(), digit->GetAmplitude(), digit->GetType()));
+ }//loop digit 2
+ }//input loop
+ }//embed
+
+ //JLK is it better to call Clear() here?
+ delete sdigArray ; //We should not delete its contents
+
+ //------------------------------
+ //remove digits below thresholds
+ // until 10-02-2010 remove digits with energy smaller than fDigitThreshold 3*fPinNoise
+ // now, remove digits with Digitized ADC smaller than fDigitThreshold = 3,
+ // before merge in the same loop real data digits if available
+ Float_t energy = 0;
+ Float_t time = 0;
+ for(i = 0 ; i < nEMC ; i++)
+ {
+ digit = dynamic_cast<AliEMCALDigit*>( digits->At(i) ) ;
+ if ( !digit ) continue;
- digits->Compress() ;
+ //Then get the energy in GeV units.
+ energy = fSDigitizer->Calibrate(digit->GetAmplitude()) ;
- Int_t ndigits = digits->GetEntriesFast() ;
+ //Then digitize using the calibration constants of the ocdb
+ Float_t ampADC = energy;
+ DigitizeEnergyTime(ampADC, time, digit->GetId()) ;
- //JLK 26-June-2008
- //After we have done the summing and digitizing to create the
- //digits, now we want to calibrate the resulting amplitude to match
- //the dynamic range of our real data.
- for (i = 0 ; i < ndigits ; i++)
- {
- digit = dynamic_cast<AliEMCALDigit *>( digits->At(i) ) ;
- if(digit)
- {
- digit->SetIndexInList(i) ;
- energy = fSDigitizer->Calibrate(digit->GetAmplitude()) ;
- time = digit->GetTime();
- Float_t ampADC = energy;
- DigitizeEnergyTime(ampADC, time, digit->GetId());
- digit->SetAmplitude(ampADC) ;
- digit->SetTime(time);
- // printf("digit amplitude set at end: i %d, amp %f\n",i,digit->GetAmplitude());
- }// digit exists
- }//Digit loop
+ if(ampADC < fDigitThreshold || IsDead(digit->GetId()))
+ digits->RemoveAt(i) ;
- }
- else AliFatal("EMCALLoader is NULL!") ;
+ } // digit loop
+
+ digits->Compress() ;
+
+ Int_t ndigits = digits->GetEntriesFast() ;
+
+ //---------------------------------------------------------------
+ //JLK 26-June-2008
+ //After we have done the summing and digitizing to create the
+ //digits, now we want to calibrate the resulting amplitude to match
+ //the dynamic range of our real data.
+ for (i = 0 ; i < ndigits ; i++)
+ {
+ digit = dynamic_cast<AliEMCALDigit *>( digits->At(i) ) ;
+ if( !digit ) continue ;
+
+ digit->SetIndexInList(i) ;
+
+ time = digit->GetTime();
+ digit->SetTime(time);
+
+ energy = fSDigitizer->Calibrate(digit->GetAmplitude()) ;
+
+ Float_t ampADC = energy;
+ DigitizeEnergyTime(ampADC, time, digit->GetId());
+
+ digit->SetAmplitude(ampADC) ;
+ // printf("digit amplitude set at end: i %d, amp %f\n",i,digit->GetAmplitude());
+ }//Digit loop
}
energy = (energy + fADCpedestalEC)/fADCchannelEC/fADCchannelECDecal ;
time += fTimeChannel-fTimeChannelDecal;
- if(energy > fNADCEC )
- energy = fNADCEC ;
+ if ( energy > fNADCEC ) energy = fNADCEC ;
}
//_____________________________________________________________________
-void AliEMCALDigitizer::Decalibrate(AliEMCALDigit *digit)
+void AliEMCALDigitizer::DecalibrateTrigger(AliEMCALDigit *digit)
{
// Decalibrate, used in Trigger digits
+
+ if ( !fCalibData ) return ;
+
// Load Geometry
const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
return;
}
+ // Recover the digit location in row-column-SM
Int_t absId = digit->GetId();
Int_t iSupMod = -1;
Int_t nModule = -1;
Int_t ieta = -1;
Bool_t bCell = geom->GetCellIndex(absId, iSupMod, nModule, nIphi, nIeta) ;
-
if (!bCell) Error("Decalibrate","Wrong cell id number : absId %i ", absId) ;
+
geom->GetCellPhiEtaIndexInSModule(iSupMod,nModule,nIphi, nIeta,iphi,ieta);
- if (fCalibData)
- {
- fADCchannelEC = fCalibData->GetADCchannel(iSupMod,ieta,iphi);
- Float_t factor = 1./(fADCchannelEC/0.0162);
-
- *digit = *digit * factor;
- }
+ // Now decalibrate
+ Float_t adcChannel = fCalibData->GetADCchannel (iSupMod,ieta,iphi);
+ Float_t adcChannelOnline = fCalibData->GetADCchannelOnline(iSupMod,ieta,iphi);
+ //printf("calib param for (SM%d,col%d,row%d): %1.4f - online param: %1.4f \n",iSupMod,ieta,iphi,adcChannel,adcChannelOnline);
+ Float_t factor = 1./(adcChannel/adcChannelOnline);
+
+ *digit = *digit * factor;
+
}
//_____________________________________________________________________
//____________________________________________________________________________
-void AliEMCALDigitizer::Digitize(Option_t *option)
-{
+void AliEMCALDigitizer::Digitize(Option_t *option)
+{
// Steering method to process digitization for events
// in the range from fFirstEvent to fLastEvent.
// This range is optionally set by SetEventRange().
// if fLastEvent=-1, then process events until the end.
// by default fLastEvent = fFirstEvent (process only one event)
-
- if (!fInit) { // to prevent overwrite existing file
+
+ if (!fInit)
+ { // to prevent overwrite existing file
Error( "Digitize", "Give a version name different from %s", fEventFolderName.Data() ) ;
return ;
- }
-
- if (strstr(option,"print")) {
-
+ }
+
+ if (strstr(option,"print"))
+ {
Print();
- return ;
+ return ;
}
if(strstr(option,"tim"))
gBenchmark->Start("EMCALDigitizer");
-
+
AliRunLoader *rl = AliRunLoader::Instance();
+
AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(rl->GetDetectorLoader("EMCAL"));
- Int_t nEvents = 0;
- if(!emcalLoader){
+ if(!emcalLoader)
+ {
AliFatal("Did not get the Loader");
+ return; // coverity
}
- else{
+
+ if (fLastEvent == -1)
+ fLastEvent = rl->GetNumberOfEvents() - 1 ;
+ else if (fDigInput)
+ fLastEvent = fFirstEvent ; // what is this ??
+
+ Int_t nEvents = fLastEvent - fFirstEvent + 1;
+ Int_t ievent = -1;
+
+ AliEMCAL * emcal = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"));
+ if(!emcal)
+ {
+ AliFatal("Did not get the AliEMCAL pointer");
+ return; // coverity
+ }
+
+ AliEMCALGeometry *geom = emcal->GetGeometry();
+ if(!geom)
+ {
+ AliFatal("Geometry pointer null");
+ return; // fix for coverity
+ }
+
+ const Int_t nTRU = geom->GetNTotalTRU();
+ TClonesArray* digitsTMP = new TClonesArray("AliEMCALDigit", nTRU*96);
+ TClonesArray* digitsTRG = new TClonesArray("AliEMCALRawDigit", nTRU*96);
+
+ rl->LoadSDigits("EMCAL");
+ for (ievent = fFirstEvent; ievent <= fLastEvent; ievent++)
+ {
+ rl->GetEvent(ievent);
- if (fLastEvent == -1) {
- fLastEvent = rl->GetNumberOfEvents() - 1 ;
- }
- else if (fDigInput)
- fLastEvent = fFirstEvent ; // what is this ??
+ Digitize(ievent) ; //Add prepared SDigits to digits and add the noise
- nEvents = fLastEvent - fFirstEvent + 1;
- Int_t ievent = -1;
-
- AliEMCALGeometry *geom = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"))->GetGeometry();
- const Int_t nTRU = geom->GetNTotalTRU();
- TClonesArray* digitsTMP = new TClonesArray("AliEMCALDigit", nTRU*96);
- TClonesArray* digitsTRG = new TClonesArray("AliEMCALRawDigit", nTRU*96);
-
- rl->LoadSDigits("EMCAL");
- for (ievent = fFirstEvent; ievent <= fLastEvent; ievent++) {
-
- rl->GetEvent(ievent);
-
- Digitize(ievent) ; //Add prepared SDigits to digits and add the noise
-
- WriteDigits() ;
-
- //Trigger Digits
- //-------------------------------------
-
-
- Digits2FastOR(digitsTMP, digitsTRG);
-
- WriteDigits(digitsTRG);
-
- (emcalLoader->TreeD())->Fill();
-
- emcalLoader->WriteDigits( "OVERWRITE");
-
- Unload();
-
- digitsTRG ->Delete();
- digitsTMP ->Delete();
-
- //-------------------------------------
-
- if(strstr(option,"deb"))
- PrintDigits(option);
- if(strstr(option,"table")) gObjectTable->Print();
-
- //increment the total number of Digits per run
- fDigitsInRun += emcalLoader->Digits()->GetEntriesFast() ;
- }//loop
-
- }//loader exists
+ WriteDigits() ;
+
+ //Trigger Digits
+ //-------------------------------------
+
+ Digits2FastOR(digitsTMP, digitsTRG);
+
+ WriteDigits(digitsTRG);
+
+ (emcalLoader->TreeD())->Fill();
+
+ emcalLoader->WriteDigits( "OVERWRITE");
+
+ Unload();
+
+ digitsTRG ->Delete();
+ digitsTMP ->Delete();
+
+ //-------------------------------------
+
+ if(strstr(option,"deb"))
+ PrintDigits(option);
+ if(strstr(option,"table")) gObjectTable->Print();
+
+ //increment the total number of Digits per run
+ fDigitsInRun += emcalLoader->Digits()->GetEntriesFast() ;
+ }//loop
- if(strstr(option,"tim")){
+ if(strstr(option,"tim"))
+ {
gBenchmark->Stop("EMCALDigitizer");
Float_t cputime = gBenchmark->GetCpuTime("EMCALDigitizer");
Float_t avcputime = cputime;
if(nEvents==0) avcputime = 0 ;
AliInfo(Form("Digitize: took %f seconds for Digitizing %f seconds per event", cputime, avcputime)) ;
- }
+ }
}
//__________________________________________________________________
if (!emcalLoader) AliFatal("Did not get the Loader");
const AliEMCALGeometry* geom = AliEMCALGeometry::GetInstance();
+ if(!geom)
+ {
+ AliFatal("Geometry pointer null");
+ return; // fix for coverity
+ }
// build FOR from simulated digits
// and xfer to the corresponding TRU input (mapping)
{
if (IsDead(digit)) continue;
- Decalibrate(digit);
+ DecalibrateTrigger(digit);
Int_t id = digit->GetId();
Int_t trgid;
- if (geom && geom->GetFastORIndexFromCellIndex(id , trgid))
+ if (geom->GetFastORIndexFromCellIndex(id , trgid))
{
AliDebug(1,Form("trigger digit id: %d from cell id: %d\n",trgid,id));
// These defaults are normally not used.
// Values are read from calibration database instead
- fADCchannelEC = 0.0153; // Update 24 Apr 2007: 250./16/1024 - width of one ADC channel in GeV
+ fADCchannelEC = 0.0162; // Nominal value set online for most of the channels, MIP peak sitting at ~266./16/1024
fADCpedestalEC = 0.0 ; // GeV
fADCchannelECDecal = 1.0; // No decalibration by default
fTimeChannel = 0.0; // No time calibration by default
//__________________________________________________________________
void AliEMCALDigitizer::WriteDigits(TClonesArray* digits, const char* branchName)
-{ // overloaded method
+{
+ // overloaded method
AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(AliRunLoader::Instance()->GetDetectorLoader("EMCAL"));
if(emcalLoader){
//__________________________________________________________________
Bool_t AliEMCALDigitizer::IsDead(AliEMCALDigit *digit)
{
- AliRunLoader *runLoader = AliRunLoader::Instance();
- AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(runLoader->GetDetectorLoader("EMCAL"));
- if (!emcalLoader) AliFatal("Did not get the Loader");
-
- AliCaloCalibPedestal *caloPed = emcalLoader->PedestalData();
- if (!caloPed) {
- AliWarning("Could not access pedestal data! No dead channel removal applied");
- return kFALSE;
- }
-
- // Load Geometry
- const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
- if (!geom) AliFatal("Did not get geometry from EMCALLoader");
-
+ // Check if cell is defined as dead, so that it is not included
+ // input is digit
Int_t absId = digit->GetId();
- Int_t iSupMod = -1;
- Int_t nModule = -1;
- Int_t nIphi = -1;
- Int_t nIeta = -1;
- Int_t iphi = -1;
- Int_t ieta = -1;
-
- Bool_t bCell = geom->GetCellIndex(absId, iSupMod, nModule, nIphi, nIeta) ;
-
- if (!bCell) Error("IsDead","Wrong cell id number : absId %i ", absId) ;
- geom->GetCellPhiEtaIndexInSModule(iSupMod,nModule,nIphi, nIeta,iphi,ieta);
- Int_t channelStatus = (Int_t)(caloPed->GetDeadMap(iSupMod))->GetBinContent(ieta,iphi);
-
- if (channelStatus == AliCaloCalibPedestal::kDead)
- return kTRUE;
- else
- return kFALSE;
+ return IsDead(absId);
+
}
//__________________________________________________________________
Bool_t AliEMCALDigitizer::IsDead(Int_t absId)
{
+ // Check if cell absID is defined as dead, so that it is not included
+
AliRunLoader *runLoader = AliRunLoader::Instance();
AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(runLoader->GetDetectorLoader("EMCAL"));
- if (!emcalLoader) AliFatal("Did not get the Loader");
-
+ if (!emcalLoader)
+ {
+ AliFatal("Did not get the Loader");
+ return kTRUE;
+ }
+
AliCaloCalibPedestal *caloPed = emcalLoader->PedestalData();
- if (!caloPed) {
+ if (!caloPed)
+ {
AliWarning("Could not access pedestal data! No dead channel removal applied");
return kFALSE;
}
// Load Geometry
const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
- if (!geom) AliFatal("Did not get geometry from EMCALLoader");
-
+ if (!geom)
+ {
+ AliFatal("Did not get geometry from EMCALLoader");
+ return kTRUE; //coverity
+ }
+
Int_t iSupMod = -1;
Int_t nModule = -1;
Int_t nIphi = -1;