Ability to apply calculated pedestals in ZS runs added
authorprsnko <prsnko@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 5 Sep 2008 15:27:59 +0000 (15:27 +0000)
committerprsnko <prsnko@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 5 Sep 2008 15:27:59 +0000 (15:27 +0000)
PHOS/AliPHOSCalibData.cxx
PHOS/AliPHOSCalibData.h
PHOS/AliPHOSEmcCalibData.cxx
PHOS/AliPHOSEmcCalibData.h
PHOS/AliPHOSRawDecoder.cxx
PHOS/AliPHOSRawDecoder.h
PHOS/AliPHOSRawDecoderv1.cxx
PHOS/AliPHOSRawDigiProducer.cxx
PHOS/AliPHOSRawDigiProducer.h

index c9b82ad..d18cae2 100644 (file)
@@ -343,6 +343,33 @@ void AliPHOSCalibData::SetTimeShiftEmc(Int_t module, Int_t column, Int_t row, Fl
  
   fCalibDataEmc->SetTimeShiftEmc(module,column,row,value);
 }
+//________________________________________________________________
+Int_t AliPHOSCalibData::GetAltroOffsetEmc(Int_t module, Int_t column, Int_t row) const
+{
+  // Return ALTRO pedestal coefficient
+  // for channel defined by (module,column,row)
+  // module, column,raw should follow the internal PHOS convention:
+  // module 1:5, column 1:56, row 1:64
+  // if CBD instance exists, the value is taken from CDB.
+  // Otherwise it is an ideal one
+  if(fCalibDataEmc)
+    return fCalibDataEmc->GetAltroOffsetEmc(module,column,row);
+  else
+    return 0; // default width of one EMC ADC channel in GeV
+}
+//________________________________________________________________
+void AliPHOSCalibData::SetAltroOffsetEmc(Int_t module, Int_t column, Int_t row, Int_t value)
+{
+  // Set altro offset for (module,column,row)
+  if(!fCalibDataEmc)
+    fCalibDataEmc = new AliPHOSEmcCalibData("PHOS-EMC");
+  fCalibDataEmc->SetAltroOffsetEmc(module,column,row,value);
+}
+
  
 //________________________________________________________________
 Float_t AliPHOSCalibData::GetADCchannelCpv(Int_t module, Int_t column, Int_t row) const
index 743a756..9f57779 100644 (file)
@@ -51,6 +51,9 @@ class AliPHOSCalibData: public TNamed {
   Float_t GetTimeShiftEmc(Int_t module, Int_t column, Int_t row) const;
   void    SetTimeShiftEmc(Int_t module, Int_t column, Int_t row, Float_t value) ;
 
+  Int_t  GetAltroOffsetEmc(Int_t module, Int_t column, Int_t row) const;
+  void   SetAltroOffsetEmc(Int_t module, Int_t column, Int_t row, Int_t value) ;
+
   //----Now CPV parameters-----------
   Float_t GetADCchannelCpv(Int_t module, Int_t column, Int_t row) const;
   void    SetADCchannelCpv(Int_t module, Int_t column, Int_t row, Float_t value);
index 88116f5..0500178 100644 (file)
@@ -56,6 +56,7 @@ AliPHOSEmcCalibData::AliPHOSEmcCalibData(const AliPHOSEmcCalibData& calibda) :
        fADCpedestalEmc[module][column][row] = calibda.fADCpedestalEmc[module][column][row];
        fHighLowRatioEmc[module][column][row] = calibda.fHighLowRatioEmc[module][column][row];
        fTimeShiftEmc[module][column][row] = calibda.fTimeShiftEmc[module][column][row];
+        fAltroOffsets[module][column][row] = calibda.fAltroOffsets[module][column][row];
       }
     }
   }
@@ -78,6 +79,7 @@ AliPHOSEmcCalibData &AliPHOSEmcCalibData::operator =(const AliPHOSEmcCalibData&
          fADCpedestalEmc[module][column][row] = calibda.fADCpedestalEmc[module][column][row];
          fHighLowRatioEmc[module][column][row] = calibda.fHighLowRatioEmc[module][column][row];
          fTimeShiftEmc[module][column][row] = calibda.fTimeShiftEmc[module][column][row];
+          fAltroOffsets[module][column][row] = calibda.fAltroOffsets[module][column][row]; 
        }
       }
     }
@@ -104,6 +106,7 @@ void AliPHOSEmcCalibData::Reset()
        fADCchannelEmc[module][column][row]  = 0.005;
        fHighLowRatioEmc[module][column][row] = 16. ;
        fTimeShiftEmc[module][column][row] = 0. ;
+        fAltroOffsets[module][column][row] = 0 ;
       }
     }
   }
@@ -165,6 +168,18 @@ void  AliPHOSEmcCalibData::Print(Option_t *option) const
       }
     }
   }
+  if (strstr(option,"altro")) {
+    printf("\n  ----    EMC altro offsets   ----\n\n");
+    for (Int_t module=0; module<5; module++){
+      printf("============== Module %d\n",module+1);
+      for (Int_t column=0; column<56; column++){
+        for (Int_t row=0; row<64; row++){
+          printf("%5d",fAltroOffsets[module][column][row]);
+        }
+        printf("\n");
+      }
+    }
+  }
 }
 
 //________________________________________________________________
@@ -206,7 +221,15 @@ Float_t AliPHOSEmcCalibData::GetTimeShiftEmc(Int_t module, Int_t column, Int_t r
 
   return fTimeShiftEmc[module-1][column-1][row-1];
 }
-
+//________________________________________________________________
+Int_t AliPHOSEmcCalibData::GetAltroOffsetEmc(Int_t module, Int_t column, Int_t row) const
+{
+  //Return EMC altro offsets
+  //module, column,raw should follow the internal PHOS convention:
+  //module 1:5, column 1:56, row 1:64
+  return fAltroOffsets[module-1][column-1][row-1];
+}
 //________________________________________________________________
 void AliPHOSEmcCalibData::SetADCchannelEmc(Int_t module, Int_t column, Int_t row, Float_t value)
 {
@@ -242,3 +265,11 @@ void AliPHOSEmcCalibData::SetTimeShiftEmc(Int_t module, Int_t column, Int_t row,
   //module 1:5, column 1:56, row 1:64
   fTimeShiftEmc[module-1][column-1][row-1] = value;
 }
+//________________________________________________________________
+void AliPHOSEmcCalibData::SetAltroOffsetEmc(Int_t module, Int_t column, Int_t row, Int_t value)
+{
+  //Set EMC pedestal
+  //module, column,raw should follow the internal PHOS convention:
+  //module 1:5, column 1:56, row 1:64
+  fAltroOffsets[module-1][column-1][row-1] = value;
+}
index 49a350b..0b7fd7c 100644 (file)
@@ -25,17 +25,20 @@ class AliPHOSEmcCalibData: public TNamed {
   Float_t GetADCpedestalEmc(Int_t module, Int_t column, Int_t row) const;
   Float_t GetHighLowRatioEmc(Int_t module, Int_t column, Int_t row) const;
   Float_t GetTimeShiftEmc(Int_t module, Int_t column, Int_t row) const;
+  Int_t   GetAltroOffsetEmc(Int_t module, Int_t column, Int_t row) const;
   //
   void SetADCchannelEmc(Int_t module, Int_t column, Int_t row, Float_t value);
   void SetADCpedestalEmc(Int_t module, Int_t column, Int_t row, Float_t value);
   void SetHighLowRatioEmc(Int_t module, Int_t column, Int_t row, Float_t value);
   void SetTimeShiftEmc(Int_t module, Int_t column, Int_t row, Float_t value);
+  void SetAltroOffsetEmc(Int_t module, Int_t column, Int_t row, Int_t value);
 
  protected:
   Float_t  fADCchannelEmc[5][56][64] ;  // width of one EMC ADC channel in GeV ([mod][col][row])
   Float_t  fADCpedestalEmc[5][56][64] ; // value of the EMC ADC pedestal ([mod][col][row])
   Float_t  fHighLowRatioEmc[5][56][64]; // ratio of High/Low gain ([mod][col][row])
   Float_t  fTimeShiftEmc[5][56][64] ;   // channel-by-channel t0 shift ([mod][col][row])
+  UInt_t   fAltroOffsets[5][56][64] ;   // channel-by-channel offsets udes in ZS
   //
   ClassDef(AliPHOSEmcCalibData,2)    // PHOS EMC calibration data
 };
index 60ba100..0976c1a 100644 (file)
@@ -43,6 +43,8 @@
 // --- AliRoot header files ---
 #include "AliPHOSRawDecoder.h"
 #include "AliRawReader.h"
+#include "AliPHOSCalibData.h"
+#include "AliLog.h"
 
 ClassImp(AliPHOSRawDecoder)
 
@@ -50,7 +52,7 @@ ClassImp(AliPHOSRawDecoder)
 AliPHOSRawDecoder::AliPHOSRawDecoder():
   fRawReader(0),fCaloStream(0),fPedSubtract(kFALSE),fEnergy(-111),fTime(-111),fQuality(0.),fPedestalRMS(0.),
   fAmpOffset(0),fModule(-1),fColumn(-1),fRow(-1),fNewModule(-1),fNewColumn(-1),fNewRow(-1),fNewAmp(0),fNewTime(0), 
-  fLowGainFlag(kFALSE),fNewLowGainFlag(kFALSE),fOverflow(kFALSE),fSamples(0),fTimes(0)
+  fLowGainFlag(kFALSE),fNewLowGainFlag(kFALSE),fOverflow(kFALSE),fSamples(0),fTimes(0),fCalibData(0)
 {
   //Default constructor.
 }
@@ -59,7 +61,7 @@ AliPHOSRawDecoder::AliPHOSRawDecoder():
 AliPHOSRawDecoder::AliPHOSRawDecoder(AliRawReader* rawReader,  AliAltroMapping **mapping):
   fRawReader(0),fCaloStream(0),fPedSubtract(kFALSE),fEnergy(-111),fTime(-111),fQuality(0.),fPedestalRMS(0.),
   fAmpOffset(0),fModule(-1),fColumn(-1),fRow(-1),fNewModule(-1),fNewColumn(-1),fNewRow(-1),fNewAmp(0),fNewTime(0),
-  fLowGainFlag(kFALSE),fNewLowGainFlag(kFALSE),fOverflow(kFALSE),fSamples(0),fTimes(0)
+  fLowGainFlag(kFALSE),fNewLowGainFlag(kFALSE),fOverflow(kFALSE),fSamples(0),fTimes(0),fCalibData(0)
 {
   //Construct a decoder object.
   //Is is user responsibility to provide next raw event 
@@ -91,7 +93,7 @@ AliPHOSRawDecoder::AliPHOSRawDecoder(const AliPHOSRawDecoder &phosDecoder ):
   fNewRow(phosDecoder.fNewRow),fNewAmp(phosDecoder.fNewAmp),fNewTime(phosDecoder.fNewTime),
   fLowGainFlag(phosDecoder.fLowGainFlag),fNewLowGainFlag(phosDecoder.fNewLowGainFlag),
   fOverflow(phosDecoder.fOverflow),fSamples(phosDecoder.fSamples),
-  fTimes(phosDecoder.fTimes)
+  fTimes(phosDecoder.fTimes),fCalibData(phosDecoder.fCalibData) 
 {
   //Copy constructor.
 }
@@ -129,6 +131,7 @@ AliPHOSRawDecoder& AliPHOSRawDecoder::operator = (const AliPHOSRawDecoder &phosD
 
     if(fTimes) delete fTimes;
     fTimes = phosDecode.fTimes;
+    fCalibData = phosDecode.fCalibData; 
   }
 
   return *this;
@@ -192,7 +195,17 @@ Bool_t AliPHOSRawDecoder::NextDigit()
           return kFALSE;
        }
        else{
-         fEnergy-=fAmpOffset ;
+         //take pedestals from DB
+         Double_t pedestal = (Double_t) fAmpOffset ;
+         if(fCalibData){
+           Float_t truePed = fCalibData->GetADCpedestalEmc(fModule, fColumn, fRow) ;
+           Int_t   altroSettings = fCalibData->GetAltroOffsetEmc(fModule, fColumn, fRow) ;
+           pedestal += truePed - altroSettings ;
+         }
+         else{
+//           printf("AliPHOSRawDecoder::NextDigit() Can not read data from OCDB \n") ;
+         }
+         fEnergy-=pedestal ;
        }
        if (fEnergy < baseLine) fEnergy = 0;
 
index e3bfff0..a9e989e 100644 (file)
@@ -13,6 +13,7 @@
 
 class TArrayI;
 class AliRawReader;
+class AliPHOSCalibData ;
 
 class AliPHOSRawDecoder {
 
@@ -40,6 +41,7 @@ public:
   const Bool_t IsOverflow() const { return fOverflow ;}
 
   const AliRawReader* GetRawReader() const { return fRawReader; }
+  void SetCalibData(AliPHOSCalibData * cdata){ fCalibData=cdata ;}
 
 protected:   
   
@@ -66,6 +68,8 @@ protected:
   Bool_t fOverflow ;   //Wether there was overflow
   TArrayI* fSamples;   // array of samples
   TArrayI* fTimes ;    // array of times corresponding to samples
+  AliPHOSCalibData * fCalibData ;   //! Calibration database if avalable
+
 
   ClassDef(AliPHOSRawDecoder,1)
 };
index 38bb488..f5a3728 100644 (file)
@@ -41,6 +41,7 @@
 #include "TList.h"
 #include "TMath.h"
 #include "TMinuit.h"
+#include "AliPHOSCalibData.h"
 
 #include "TCanvas.h"
 #include "TH1.h"
@@ -216,7 +217,16 @@ Bool_t AliPHOSRawDecoderv1::NextDigit()
          return kFALSE;
       }
       else{
+        //take pedestals from DB
         pedestal = fAmpOffset ;
+        if(fCalibData){
+           Float_t truePed = fCalibData->GetADCpedestalEmc(fModule, fColumn, fRow) ;
+           Int_t   altroSettings = fCalibData->GetAltroOffsetEmc(fModule, fColumn, fRow) ;
+           pedestal += truePed - altroSettings ;
+         }
+         else{
+//           printf("AliPHOSRawDecoderv1::NextDigit(): Can not read data from OCDB \n") ;
+         }
       }
 
       //calculate time and energy
index 88dba28..a7ea57a 100644 (file)
@@ -52,6 +52,7 @@ AliPHOSRawDigiProducer::AliPHOSRawDigiProducer():
   fEmcMinE(0.),
   fCpvMinE(0.),
   fSampleQualityCut(1.),
+  fGlobalAltroOffset(0),
   fEmcCrystals(0),
   fGeom(0),
   fPulseGenerator(0)
@@ -64,6 +65,7 @@ AliPHOSRawDigiProducer::AliPHOSRawDigiProducer(const AliPHOSRecoParam* recoParam
   fEmcMinE(0.),
   fCpvMinE(0.),
   fSampleQualityCut(1.),
+  fGlobalAltroOffset(0),
   fEmcCrystals(0),
   fGeom(0),
   fPulseGenerator(0)
@@ -74,8 +76,8 @@ AliPHOSRawDigiProducer::AliPHOSRawDigiProducer(const AliPHOSRecoParam* recoParam
 
   fEmcMinE = recoParam->GetEMCMinE();
   fCpvMinE = recoParam->GetCPVMinE();
-
   fSampleQualityCut = recoParam->GetEMCSampleQualityCut() ;
+  fGlobalAltroOffset = recoParam->GetGlobalAltroOffset() ;
 
   fGeom=AliPHOSGeometry::GetInstance() ;
   if(!fGeom) fGeom = AliPHOSGeometry::GetInstance("IHEP");
@@ -92,6 +94,7 @@ AliPHOSRawDigiProducer::AliPHOSRawDigiProducer(const AliPHOSRawDigiProducer &dp)
   fEmcMinE(0.),
   fCpvMinE(0.),
   fSampleQualityCut(1.),
+  fGlobalAltroOffset(0),
   fEmcCrystals(0),
   fGeom(0),
   fPulseGenerator(0)
@@ -114,6 +117,7 @@ AliPHOSRawDigiProducer& AliPHOSRawDigiProducer::operator= (const AliPHOSRawDigiP
   fEmcMinE = dp.fEmcMinE ;
   fCpvMinE = dp.fCpvMinE ;
   fSampleQualityCut = dp.fSampleQualityCut ;
+  fGlobalAltroOffset = dp.fGlobalAltroOffset ;
   fEmcCrystals = dp.fEmcCrystals ;
   fGeom = dp.fGeom ;
   if(fPulseGenerator) delete fPulseGenerator ;
@@ -144,6 +148,13 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawDecoder*
   //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()) {
 
index 58aaf2f..a233783 100644 (file)
@@ -44,6 +44,7 @@ private:
   Float_t fEmcMinE ;                 // minimum energy of digit to be included into cluster
   Float_t fCpvMinE ;                 // minimum energy of digit to be included into cluster
   Float_t fSampleQualityCut;         // Cut on sample shapes: 0: no samples; 1: default parameterization; 999: accept even obviously bad
+  Int_t   fGlobalAltroOffset;        // Global ALTRO offset used in ZS runs
 
   Int_t fEmcCrystals ;               //  number of EMC crystals
   AliPHOSGeometry * fGeom ;          //! PHOS geometry