#include "AliEMCALCalibData.h"
#include "AliEMCALSimParam.h"
#include "AliEMCALRawDigit.h"
+#include "AliCaloCalibPedestal.h"
namespace
{
//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
fADCpedestalEC = fCalibData->GetADCpedestal (iSupMod,ieta,iphi);
fADCchannelEC = fCalibData->GetADCchannel (iSupMod,ieta,iphi);
fADCchannelECDecal = fCalibData->GetADCchannelDecal (iSupMod,ieta,iphi);
- fTimeChannel = fCalibData->GetTimeChannel (iSupMod,ieta,iphi);
+ fTimeChannel = fCalibData->GetTimeChannel (iSupMod,ieta,iphi,0); // Assign bunch crossing number equal to 0 (has simulation different bunch crossings?)
fTimeChannelDecal = fCalibData->GetTimeChannelDecal(iSupMod,ieta,iphi);
}
energy = fNADCEC ;
}
+//_____________________________________________________________________
+void AliEMCALDigitizer::Decalibrate(AliEMCALDigit *digit)
+{
+ // Load Geometry
+ const AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
+
+ if (!geom) {
+ AliFatal("Did not get geometry from EMCALLoader");
+ return;
+ }
+
+ 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("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 factor = 1./(fADCchannelEC/0.0162);
+
+ *digit = *digit * factor;
+ }
+}
+
//_____________________________________________________________________
void AliEMCALDigitizer::CalibrateADCTime(Float_t & adc, Float_t & time, const Int_t absId)
{
if(fCalibData) {
fADCpedestalEC = fCalibData->GetADCpedestal(iSupMod,ieta,iphi);
fADCchannelEC = fCalibData->GetADCchannel (iSupMod,ieta,iphi);
- fTimeChannel = fCalibData->GetTimeChannel(iSupMod,ieta,iphi);
+ fTimeChannel = fCalibData->GetTimeChannel(iSupMod,ieta,iphi,0);// Assign bunch crossing number equal to 0 (has simulation different bunch crossings?)
}
adc = adc * fADCchannelEC - fADCpedestalEC;
AliRunLoader *runLoader = AliRunLoader::Instance();
- AliRun* run = runLoader->GetAliRun();
-
AliEMCALLoader *emcalLoader = dynamic_cast<AliEMCALLoader*>(runLoader->GetDetectorLoader("EMCAL"));
- if(!emcalLoader){
- AliFatal("Did not get the Loader");
- }
- else {
- AliEMCAL* emcal = dynamic_cast<AliEMCAL*>(run->GetDetector("EMCAL"));
- if(emcal){
- AliEMCALGeometry* geom = emcal->GetGeometry();
+ if (!emcalLoader) AliFatal("Did not get the Loader");
+
+ const AliEMCALGeometry* geom = AliEMCALGeometry::GetInstance();
// build FOR from simulated digits
// and xfer to the corresponding TRU input (mapping)
- TClonesArray* digits = emcalLoader->Digits();
-
+ TClonesArray* sdigits = emcalLoader->SDigits();
+
+ TClonesArray *digits = (TClonesArray*)sdigits->Clone();
+
+ AliDebug(999,Form("=== %d SDigits to trigger digits ===",digits->GetEntriesFast()));
+
TIter NextDigit(digits);
while (AliEMCALDigit* digit = (AliEMCALDigit*)NextDigit())
{
+ if (IsDead(digit)) continue;
+
+ Decalibrate(digit);
+
Int_t id = digit->GetId();
Int_t trgid;
}
if (AliDebugLevel()) printf("Number of TRG digits: %d\n",digitsTMP->GetEntriesFast());
-
+
Int_t nSamples = 32;
Int_t *timeSamples = new Int_t[nSamples];
// FIXME: Check digit time!
if (depositedEnergy)
{
+ depositedEnergy += gRandom->Gaus(0., .08);
+
DigitalFastOR(time, depositedEnergy, timeSamples, nSamples);
for (Int_t j=0;j<nSamples;j++)
}
new((*digitsTRG)[digitsTRG->GetEntriesFast()]) AliEMCALRawDigit(id, timeSamples, nSamples);
+
+ if (AliDebugLevel()) ((AliEMCALRawDigit*)digitsTRG->At(digitsTRG->GetEntriesFast() - 1))->Print("");
}
}
}
delete [] timeSamples;
- }// AliEMCAL exists
- else AliFatal("Could not get AliEMCAL");
- }// loader exists
-
+
+ if (digits && digits->GetEntriesFast()) digits->Delete();
}
//____________________________________________________________________________
// id: 0..95
const Int_t reso = 11; // 11-bit resolution ADC
const Double_t vFSR = 1; // Full scale input voltage range
- const Double_t dNe = 125; // signal of the APD per MeV of energy deposit in a tower: 125 photo-e-/MeV @ M=30
+// const Double_t dNe = 125; // signal of the APD per MeV of energy deposit in a tower: 125 photo-e-/MeV @ M=30
+ const Double_t dNe = 125/1.3; // F-ALTRO max V. FEE: factor 4
const Double_t vA = .136e-6; // CSP output range: 0.136uV/e-
- const Double_t rise = 40e-9; // rise time (10-90%) of the FastOR signal before shaping
+ const Double_t rise = 50e-9; // rise time (10-90%) of the FastOR signal before shaping
const Double_t kTimeBinWidth = 25E-9; // sampling frequency (40MHz)
Double_t vV = 1000. * dE * dNe * vA; // GeV 2 MeV
-
+
TF1 signalF("signal", AnalogFastORFunction, 0, nSamples * kTimeBinWidth, 3);
signalF.SetParameter( 0, vV );
signalF.SetParameter( 1, time ); // FIXME: when does the signal arrive? Might account for cable lengths
else AliFatal("Loader not available");
}
+//__________________________________________________________________
+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");
+
+ 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;
+}
+
+
+//__________________________________________________________________
+Bool_t AliEMCALDigitizer::IsDead(Int_t absId)
+{
+ 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");
+
+ 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;
+}
+