fGeom(0),
fPulseGenerator(0),
fRawReader(0),
- fRawStream(0)
+ fRawStream(0),
+ fADCValuesLG(0),
+ fADCValuesHG(0)
{
// Default constructor
fGeom(0),
fPulseGenerator(0),
fRawReader(rawReader),
- fRawStream(0)
+ fRawStream(0),
+ fADCValuesLG(0),
+ fADCValuesHG(0)
{
// Default constructor
fGeom(0),
fPulseGenerator(0),
fRawReader(0),
- fRawStream(0)
+ fRawStream(0),
+ fADCValuesLG(0),
+ fADCValuesHG(0)
+
{
// Copy constructor
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();
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
fGeom->RelToAbsNumbering(relId, absId);
fitter->SetNBunches(0);
- while (fRawStream->NextBunch()) { //Take first in time banch
+ 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();
+ 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()
continue ;
energy = CalibrateE(energy,relId,!caloFlag) ;
-// time = CalibrateT(time,relId,lowGainFlag) ;
//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:
+ //Very strange behaviour of electronics, but cross-checkes several times...
+ if( fRawStream->GetL1Phase()<55.*1.e-9 ) //for phase=0,25,50
+ time -= fRawStream->GetL1Phase();
+ else //for phase 75
+ time += 25.*1.e-9 ;
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) ;
if(digHG->GetEnergy()<0.){ //This is overflow in HG
digHG->SetTime(digLG->GetTime()) ;
digHG->SetEnergy(digLG->GetEnergy()) ;
+ digHG->SetLG(kTRUE) ;
}
}
else{ //no pair - remove
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];