X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=PHOS%2FAliPHOSRawDigiProducer.cxx;h=e8d71b7c22a91e8a2bf8c20faa64446a223a8265;hb=c109b8c741f78c359e5d4edbd4079db335e5bd1a;hp=f94e27565874672f08b173dda1a1bab7a4dcafd5;hpb=92236b27196163b4ae2c345cd270b0f6b7562f76;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOSRawDigiProducer.cxx b/PHOS/AliPHOSRawDigiProducer.cxx index f94e2756587..e8d71b7c22a 100644 --- a/PHOS/AliPHOSRawDigiProducer.cxx +++ b/PHOS/AliPHOSRawDigiProducer.cxx @@ -52,11 +52,14 @@ AliPHOSRawDigiProducer::AliPHOSRawDigiProducer(): 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 @@ -75,11 +78,14 @@ AliPHOSRawDigiProducer::AliPHOSRawDigiProducer(AliRawReader *rawReader, 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 @@ -99,17 +105,22 @@ AliPHOSRawDigiProducer::AliPHOSRawDigiProducer(const AliPHOSRawDigiProducer &dp) 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 ; @@ -124,6 +135,7 @@ AliPHOSRawDigiProducer& AliPHOSRawDigiProducer::operator= (const AliPHOSRawDigiP fEmcMinE = dp.fEmcMinE ; fCpvMinE = dp.fCpvMinE ; fSampleQualityCut = dp.fSampleQualityCut ; + fSampleToSec = dp.fSampleToSec ; fEmcCrystals = dp.fEmcCrystals ; fGeom = dp.fGeom ; if(fPulseGenerator) delete fPulseGenerator ; @@ -137,6 +149,8 @@ AliPHOSRawDigiProducer::~AliPHOSRawDigiProducer() if(fPulseGenerator) delete fPulseGenerator ; fPulseGenerator=0 ; delete fRawStream; + delete [] fADCValuesLG; + delete [] fADCValuesHG; } //-------------------------------------------------------------------------------------- void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0* fitter) @@ -148,10 +162,17 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0 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 ; @@ -161,25 +182,52 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0 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; iSetNBunches(nBunches); Double_t energy = fitter->GetEnergy() ; Double_t time = fitter->GetTime() ; @@ -195,14 +243,19 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0 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(tmpLG.At(ilgDigit))->SetALTROSamplesLG(sigLength,fADCValuesLG); ilgDigit++ ; } else if (caloFlag == AliCaloRawStreamV3::kHighGain) { @@ -211,6 +264,8 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0 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(digits->At(iDigit))->SetALTROSamplesHG(sigLength,fADCValuesHG); iDigit++; } } // End of NextChannel() @@ -239,19 +294,10 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0 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()