]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSRawDigiProducer.cxx
Updated histogram limits (PHOS energy)
[u/mrichter/AliRoot.git] / PHOS / AliPHOSRawDigiProducer.cxx
index 80d93c3fa67e2661bbac4727a2e2adde67d7bea9..a7ea57a17751be95ff46e04ad64fb66f1ab22cd4 100644 (file)
@@ -39,6 +39,7 @@
 #include "AliPHOSDigit.h"
 #include "AliPHOSRecoParam.h"
 #include "AliPHOSCalibData.h"
+#include "AliPHOSPulseGenerator.h"
 #include "AliLog.h"
 
 ClassImp(AliPHOSRawDigiProducer)
@@ -46,50 +47,90 @@ ClassImp(AliPHOSRawDigiProducer)
 AliPHOSCalibData * AliPHOSRawDigiProducer::fgCalibData  = 0 ; 
 
 //--------------------------------------------------------------------------------------
-AliPHOSRawDigiProducer::AliPHOSRawDigiProducer():TObject(),
-  fEmcMinE(0.),fCpvMinE(0.),fSampleQualityCut(1.),fEmcCrystals(0),fGeom(0){
-
+AliPHOSRawDigiProducer::AliPHOSRawDigiProducer():
+  TObject(),
+  fEmcMinE(0.),
+  fCpvMinE(0.),
+  fSampleQualityCut(1.),
+  fGlobalAltroOffset(0),
+  fEmcCrystals(0),
+  fGeom(0),
+  fPulseGenerator(0)
+{
+  // Default constructor
 }
 //--------------------------------------------------------------------------------------
-AliPHOSRawDigiProducer::AliPHOSRawDigiProducer(const AliPHOSRecoParam* parEmc, const AliPHOSRecoParam* parCpv):TObject(),
-  fEmcMinE(0.),fCpvMinE(0.),fSampleQualityCut(1.),fEmcCrystals(0),fGeom(0){
-
-  if(!parEmc) AliFatal("Reconstruction parameters for EMC not set!");
-  if(!parCpv) AliFatal("Reconstruction parameters for CPV not set!");
+AliPHOSRawDigiProducer::AliPHOSRawDigiProducer(const AliPHOSRecoParam* recoParam):
+  TObject(),
+  fEmcMinE(0.),
+  fCpvMinE(0.),
+  fSampleQualityCut(1.),
+  fGlobalAltroOffset(0),
+  fEmcCrystals(0),
+  fGeom(0),
+  fPulseGenerator(0)
+{
+  // Constructor takes paramerters from recoParam
 
-  fEmcMinE = parEmc->GetMinE();
-  fCpvMinE = parCpv->GetMinE();
+  if(!recoParam) AliFatal("Reconstruction parameters are not set!");
 
-  fSampleQualityCut = parEmc->GetSampleQualityCut() ;
+  fEmcMinE = recoParam->GetEMCMinE();
+  fCpvMinE = recoParam->GetCPVMinE();
+  fSampleQualityCut = recoParam->GetEMCSampleQualityCut() ;
+  fGlobalAltroOffset = recoParam->GetGlobalAltroOffset() ;
 
   fGeom=AliPHOSGeometry::GetInstance() ;
   if(!fGeom) fGeom = AliPHOSGeometry::GetInstance("IHEP");
 
   fEmcCrystals=fGeom->GetNCristalsInModule()*fGeom->GetNModules() ;
 
+  fPulseGenerator = new AliPHOSPulseGenerator();
+
   GetCalibrationParameters() ; 
 }
 //--------------------------------------------------------------------------------------                       
-AliPHOSRawDigiProducer::AliPHOSRawDigiProducer(const AliPHOSRawDigiProducer &dp):TObject(),
-  fEmcMinE(0.),fCpvMinE(0.),fSampleQualityCut(1.),fEmcCrystals(0),fGeom(0){                                                          
+AliPHOSRawDigiProducer::AliPHOSRawDigiProducer(const AliPHOSRawDigiProducer &dp):
+  TObject(),
+  fEmcMinE(0.),
+  fCpvMinE(0.),
+  fSampleQualityCut(1.),
+  fGlobalAltroOffset(0),
+  fEmcCrystals(0),
+  fGeom(0),
+  fPulseGenerator(0)
+{                                                          
+  // Copy constructor
 
   fEmcMinE = dp.fEmcMinE ;
   fCpvMinE = dp.fCpvMinE ;
   fEmcCrystals = dp.fEmcCrystals ;
+  fPulseGenerator = new AliPHOSPulseGenerator();
   fGeom = dp.fGeom ;
 }
 //--------------------------------------------------------------------------------------
-AliPHOSRawDigiProducer& AliPHOSRawDigiProducer::operator= (const AliPHOSRawDigiProducer &dp){
+AliPHOSRawDigiProducer& AliPHOSRawDigiProducer::operator= (const AliPHOSRawDigiProducer &dp)
+{
+  // Assign operator
+
   if(&dp == this) return *this;
 
   fEmcMinE = dp.fEmcMinE ;
   fCpvMinE = dp.fCpvMinE ;
   fSampleQualityCut = dp.fSampleQualityCut ;
+  fGlobalAltroOffset = dp.fGlobalAltroOffset ;
   fEmcCrystals = dp.fEmcCrystals ;
   fGeom = dp.fGeom ;
+  if(fPulseGenerator) delete fPulseGenerator ;
+  fPulseGenerator = new AliPHOSPulseGenerator();
   return  *this;
 } 
+//--------------------------------------------------------------------------------------                                                   
+AliPHOSRawDigiProducer::~AliPHOSRawDigiProducer()
+{
+  // Desctructor
+  if(fPulseGenerator) delete fPulseGenerator ;
+  fPulseGenerator=0 ;
+}
 //--------------------------------------------------------------------------------------
 void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawDecoder* decoder) 
 {
@@ -102,11 +143,18 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawDecoder*
   Int_t relId[4], absId =0;
 
   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 
+  const Double_t highLowDiff=2.; //Maximal difference between High and Low channels in LG adc channels 
 
   //Temporary array for LowGain digits
   TClonesArray tmpLG("AliPHOSDigit",10000) ;
   Int_t ilgDigit=0 ;
+
+
+  //Read current altro offcet from RCU
+  decoder->SetAmpOffset(fGlobalAltroOffset) ;
+
+  //Let decoder subtract pedestals in case of ZS
+  decoder->SetCalibData(fgCalibData) ;
   
   while (decoder->NextDigit()) {
 
@@ -114,10 +162,12 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawDecoder*
     if(energy<=baseLine) //in ADC channels
       continue ;
 
-    //remove digits with bas shape. Decoder should calculate quality so that 
+    //remove digits with bad shape. Decoder should calculate quality so that 
     //in default case quality [0,1], while larger values of quality mean somehow 
     //corrupted samples, 999 means obviously corrupted sample.
-    if(decoder->GetSampleQuality() > fSampleQualityCut )
+    //It is difficult to fit samples with overflow (even setting cut on overflow values)
+    //because too few points are left to fit. So we do not evaluate samples with overflow
+    if(decoder->GetSampleQuality() > fSampleQualityCut && !(decoder->IsOverflow()))
        continue ;
 
     Bool_t lowGainFlag = decoder->IsLowGain();
@@ -157,34 +207,36 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawDecoder*
   tmpLG.Sort() ;
   Int_t iLG = 0;
   Int_t nLG1 = tmpLG.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)) ;
-    while(iLG<nLG1 && digHG->GetId()> digLG->GetId()){
+    while(digLG && iLG<nLG1 && digHG->GetId()> digLG->GetId()){
       iLG++ ;
       digLG = dynamic_cast<AliPHOSDigit*>(tmpLG.At(iLG)) ;
     }
+    absId=digHG->GetId() ;                                                                                                         
+    fGeom->AbsToRelNumbering(absId,relId) ;                                                                                              
     if(digLG && digHG->GetId() == digLG->GetId()){ //we found pair
       if(digHG->GetEnergy()<0.){ //This is overflow in HG
         digHG->SetTime(digLG->GetTime()) ;
         digHG->SetEnergy(digLG->GetEnergy()) ;
       } 
       else{ //Make approximate comparison of HG and LG energies
-        Double_t de = (digHG->GetEnergy()-digLG->GetEnergy())/16./0.005 ; //aproximate difference in LG ADC ch. 
-        if(TMath::Abs(de)>highLowDiff){ //too strong difference, remove digit
+        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
-      Int_t absId=digHG->GetId() ;
-      Int_t relId[4] ;
-      fGeom->AbsToRelNumbering(absId,relId) ;
       if(relId[2]%2==1 && relId[3]%16==4) 
         continue ;
-      digits->RemoveAt(iDig) ;                                                                                                            
+      if(digHG->GetEnergy()>CalibrateE(double(5.),relId,1)) //One can not always find LG with Amp<5 ADC ch.
+        digits->RemoveAt(iDig) ;                                                                                                            
     }
   }
 
@@ -215,6 +267,7 @@ Double_t AliPHOSRawDigiProducer::CalibrateE(Double_t amp, Int_t* relId, Bool_t i
 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];
@@ -252,7 +305,7 @@ void AliPHOSRawDigiProducer::CleanDigits(TClonesArray * digits)
     if(isBadMap){ //check bad map now
       Int_t relid[4] ;
       fGeom->AbsToRelNumbering(digit->GetId(), relid) ; 
-      if(fgCalibData->IsBadChannelEmc(relid[0],relid[2],relid[3])){
+      if(fgCalibData->IsBadChannelEmc(relid[0],relid[3],relid[2])){
        digits->RemoveAt(i) ;
       }
     }