fEmcMinE(0.),
fCpvMinE(0.),
fSampleQualityCut(1.),
+ fSampleToSec(0.),
fEmcCrystals(0),
fGeom(0),
fPulseGenerator(0),
fRawReader(0),
- fRawStream(0)
+ fRawStream(0),
+ fADCValuesLG(0),
+ fADCValuesHG(0)
{
// Default constructor
fEmcMinE(0.),
fCpvMinE(0.),
fSampleQualityCut(1.),
+ fSampleToSec(0.),
fEmcCrystals(0),
fGeom(0),
fPulseGenerator(0),
fRawReader(rawReader),
- fRawStream(0)
+ fRawStream(0),
+ fADCValuesLG(0),
+ fADCValuesHG(0)
{
// Default constructor
fEmcMinE(0.),
fCpvMinE(0.),
fSampleQualityCut(1.),
+ fSampleToSec(0.),
fEmcCrystals(0),
fGeom(0),
fPulseGenerator(0),
fRawReader(0),
- fRawStream(0)
+ fRawStream(0),
+ fADCValuesLG(0),
+ fADCValuesHG(0)
+
{
// Copy constructor
fEmcMinE = dp.fEmcMinE ;
fCpvMinE = dp.fCpvMinE ;
fSampleQualityCut = dp.fSampleQualityCut;
+ fSampleToSec = dp.fSampleToSec ;
fEmcCrystals = dp.fEmcCrystals ;
fPulseGenerator = new AliPHOSPulseGenerator();
fGeom = dp.fGeom ;
fEmcMinE = dp.fEmcMinE ;
fCpvMinE = dp.fCpvMinE ;
fSampleQualityCut = dp.fSampleQualityCut ;
+ fSampleToSec = dp.fSampleToSec ;
fEmcCrystals = dp.fEmcCrystals ;
fGeom = dp.fGeom ;
if(fPulseGenerator) delete fPulseGenerator ;
if(fPulseGenerator) delete fPulseGenerator ;
fPulseGenerator=0 ;
delete fRawStream;
+ delete [] fADCValuesLG;
+ delete [] fADCValuesHG;
}
//--------------------------------------------------------------------------------------
void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0* fitter)
+{
+ // Create a temporary array of LG digits and then make digits from raw data
+
+ TClonesArray *tmpLG = new TClonesArray("AliPHOSDigit",10000) ;
+ MakeDigits(digits, tmpLG, fitter);
+ tmpLG->Delete();
+ delete tmpLG;
+}
+//--------------------------------------------------------------------------------------
+void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, TClonesArray *tmpDigLG, AliPHOSRawFitterv0* fitter)
{
//Makes the job.
- //TClonesArray *digits and raw data fitter should be provided by calling function.
+ //TClonesArray *digits, *tmpDigLG and raw data fitter should be provided by calling function.
digits->Clear();
Int_t relId[4], absId=-1, caloFlag=-1;
const Double_t baseLine=1. ; //Minimal energy of digit in ADC ch.
+
+ //Calculate conversion coeff. from Sample time step to seconds
+ //If OCDB contains negative or zero value - use one from RCU trailer
+ //Negative value in OCDB is used only for simulation of raw digits
+ if(fgCalibData->GetSampleTimeStep()>0.)
+ fSampleToSec=fgCalibData->GetSampleTimeStep() ;
+ else
+ fSampleToSec=fRawStream->GetTSample() ;
- //Temporary array for LowGain digits
- TClonesArray tmpLG("AliPHOSDigit",10000) ;
+ // Clear a temporary array for LowGain digits
+ tmpDigLG->Clear();
Int_t ilgDigit=0 ;
//Let fitter subtract pedestals in case of ZS
while (fRawStream->NextDDL()) {
while (fRawStream->NextChannel()) {
- relId[0] = fRawStream->GetModule() + 1; // counts from 1 to 5
+ relId[0] = 5 - fRawStream->GetModule() ; // counts from 1 to 5
relId[1] = 0;
relId[2] = fRawStream->GetCellX() + 1; // counts from 1 to 64
relId[3] = fRawStream->GetCellZ() + 1; // counts from 1 to 56
caloFlag = fRawStream->GetCaloFlag(); // 0=LG, 1=HG, 2=TRU
- fGeom->RelToAbsNumbering(relId, absId);
+
+ if(caloFlag!=0 && caloFlag!=1) continue; //TRU data!
+
+ fitter->SetChannelGeo(relId[0],relId[2],relId[3],caloFlag);
- Int_t nBunches = 0;
- while (fRawStream->NextBunch()) {
- nBunches++;
- if (nBunches > 1) continue;
+ if(fitter->GetAmpOffset()==0 && fitter->GetAmpThreshold()==0) {
+ short value = fRawStream->GetAltroCFG1();
+ bool ZeroSuppressionEnabled = (value >> 15) & 0x1;
+ if(ZeroSuppressionEnabled) {
+ short offset = (value >> 10) & 0xf;
+ short threshold = value & 0x3ff;
+ fitter->SubtractPedestals(kFALSE);
+ fitter->SetAmpOffset(offset);
+ fitter->SetAmpThreshold(threshold);
+ }
+ }
+
+ fGeom->RelToAbsNumbering(relId, absId);
+
+ fitter->SetNBunches(0);
+ Int_t sigStart =0 ;
+ Int_t sigLength=0 ;
+ while (fRawStream->NextBunch()) { //Take the first in time bunch
const UShort_t *sig = fRawStream->GetSignals();
- Int_t sigStart = fRawStream->GetStartTimeBin();
- Int_t sigLength = fRawStream->GetBunchLength();
- fitter->SetChannelGeo(relId[0],relId[2],relId[3],caloFlag);
+ sigStart = fRawStream->GetStartTimeBin();
+ sigLength = fRawStream->GetBunchLength();
fitter->Eval(sig,sigStart,sigLength);
+ if (caloFlag == AliCaloRawStreamV3::kLowGain) {
+ delete [] fADCValuesLG;
+ fADCValuesLG = new Int_t[sigLength];
+ for (Int_t i=0; i<sigLength; i++)
+ fADCValuesLG[sigLength-i-1] = sig[i];
+ }
+ else if (caloFlag == AliCaloRawStreamV3::kHighGain) {
+ delete [] fADCValuesHG;
+ fADCValuesHG = new Int_t[sigLength];
+ for (Int_t i=0; i<sigLength; i++)
+ fADCValuesHG[sigLength-i-1] = sig[i];
+ }
} // End of NextBunch()
- fitter->SetNBunches(nBunches);
Double_t energy = fitter->GetEnergy() ;
Double_t time = fitter->GetTime() ;
if(fitter->GetSignalQuality() > fSampleQualityCut && !(fitter->IsOverflow()))
continue ;
-// energy = CalibrateE(energy,relId,lowGainFlag) ;
-// time = CalibrateT(time,relId,lowGainFlag) ;
+ energy = CalibrateE(energy,relId,!caloFlag) ;
+
+ //convert time from sample bin units to s
+ time*=fSampleToSec ;
+//CalibrateT moved to Clusterizer
+// time = CalibrateT(time,relId,!caloFlag) ;
+ // subtract RCU L1 phase (L1Phase is in seconds) w.r.t. L0:
+ time -= fRawStream->GetL1Phase();
+
+
if(energy <= 0.)
continue;
if (caloFlag == AliCaloRawStreamV3::kLowGain) {
- new(tmpLG[ilgDigit]) AliPHOSDigit(-1,absId,(Float_t)energy,(Float_t)time);
+ new((*tmpDigLG)[ilgDigit]) AliPHOSDigit(-1,absId,(Float_t)energy,(Float_t)time);
+ if (sigLength>0 && fADCValuesLG!=0)
+ static_cast<AliPHOSDigit*>(tmpDigLG->At(ilgDigit))->SetALTROSamplesLG(sigLength,fADCValuesLG);
ilgDigit++ ;
}
else if (caloFlag == AliCaloRawStreamV3::kHighGain) {
new((*digits)[iDigit]) AliPHOSDigit(-1,absId,-1.f,(Float_t)time);
else
new((*digits)[iDigit]) AliPHOSDigit(-1,absId,(Float_t)energy,(Float_t)time);
+ if (sigLength>0 && fADCValuesHG!=0)
+ static_cast<AliPHOSDigit*>(digits->At(iDigit))->SetALTROSamplesHG(sigLength,fADCValuesHG);
iDigit++;
}
} // End of NextChannel()
//replace energy of HighGain digits only if there is overflow
//negative energy (overflow)
digits->Sort() ;
- tmpLG.Sort() ;
+ tmpDigLG->Sort() ;
Int_t iLG = 0;
- Int_t nLG1 = tmpLG.GetEntriesFast()-1 ;
+ Int_t nLG1 = tmpDigLG->GetEntriesFast()-1 ;
for(Int_t iDig=0 ; iDig < digits->GetEntriesFast() ; iDig++) {
AliPHOSDigit * digHG = dynamic_cast<AliPHOSDigit*>(digits->At(iDig)) ;
if (!digHG) continue;
- AliPHOSDigit * digLG = dynamic_cast<AliPHOSDigit*>(tmpLG.At(iLG)) ;
+ AliPHOSDigit * digLG = dynamic_cast<AliPHOSDigit*>(tmpDigLG->At(iLG)) ;
while(digLG && iLG<nLG1 && digHG->GetId()> digLG->GetId()){
iLG++ ;
- digLG = dynamic_cast<AliPHOSDigit*>(tmpLG.At(iLG)) ;
+ digLG = dynamic_cast<AliPHOSDigit*>(tmpDigLG->At(iLG)) ;
}
absId=digHG->GetId() ;
fGeom->AbsToRelNumbering(absId,relId) ;
Double_t AliPHOSRawDigiProducer::CalibrateT(Double_t time, Int_t * relId, Bool_t /* isLowGain */)
{
//Calibrate time
- time*=fPulseGenerator->GetRawFormatTimeTrigger() ;
if(fgCalibData){
Int_t module = relId[0];
Int_t column = relId[3];