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)
Int_t iDigit=0 ;
Int_t relId[4], absId=-1, caloFlag=-1;
-
+
const Double_t baseLine=1. ; //Minimal energy of digit in ADC ch.
- const Double_t highLowDiff=2.; //Maximal difference between High and Low channels in LG adc channels
+ //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) ;
Int_t ilgDigit=0 ;
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
+
+ if(caloFlag!=0 && caloFlag!=1) continue; //TRU data!
+
+ fitter->SetChannelGeo(relId[0],relId[2],relId[3],caloFlag);
+
+ 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);
-
- Int_t nBunches = 0;
- while (fRawStream->NextBunch()) {
- nBunches++;
- if (nBunches > 1) continue;
+
+ 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) ;
+ energy = CalibrateE(energy,relId,!caloFlag) ;
// time = CalibrateT(time,relId,lowGainFlag) ;
+
+ //convert time from sample bin units to s
+ time*=fSampleToSec ;
if(energy <= 0.)
continue;
if (caloFlag == AliCaloRawStreamV3::kLowGain) {
new(tmpLG[ilgDigit]) AliPHOSDigit(-1,absId,(Float_t)energy,(Float_t)time);
+ if (sigLength>0 && fADCValuesLG!=0)
+ dynamic_cast<AliPHOSDigit*>(tmpLG.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)
+ dynamic_cast<AliPHOSDigit*>(digits->At(iDigit))->SetALTROSamplesHG(sigLength,fADCValuesHG);
iDigit++;
}
} // End of NextChannel()
digHG->SetTime(digLG->GetTime()) ;
digHG->SetEnergy(digLG->GetEnergy()) ;
}
- else{ //Make approximate comparison of HG and LG energies
- Double_t de = (digHG->GetEnergy()-digLG->GetEnergy()) ;
- if(TMath::Abs(de)>CalibrateE(double(highLowDiff),relId,1)){ //too strong difference, remove digit
- digits->RemoveAt(iDig) ;
- }
- }
}
else{ //no pair - remove
- // temporary fix for dead LG channels
- if(relId[2]%2==1 && relId[3]%16==4)
- continue ;
- if(digHG->GetEnergy()>CalibrateE(double(5.),relId,1)) //One can not always find LG with Amp<5 ADC ch.
- digits->RemoveAt(iDig) ;
+ if(digHG->GetEnergy()<0.) //no pair, in saturation
+ digits->RemoveAt(iDig) ;
}
}
} // End of NextDDL()