]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSGetter.cxx
Record changes.
[u/mrichter/AliRoot.git] / PHOS / AliPHOSGetter.cxx
index 5fdc8489ad20aa504312f6bc9036bbc5db1f2b77..c007ccf7f346734bbdb112e8ab6e8b42e75d1887 100644 (file)
@@ -46,7 +46,8 @@
 #include <TParticle.h>
 #include <TF1.h>
 #include <TGraph.h>
-//#include <TCanvas.h>
+#include <TCanvas.h>
+#include <TStyle.h>
 //#include <TFrame.h>
 
 // --- Standard library ---
 #include "AliPHOSRawStream.h"
 #include "AliRawReaderFile.h"
 #include "AliLog.h"
+#include "AliCDBLocal.h"
+#include "AliCDBStorage.h"
+#include "AliCDBManager.h"
 
 ClassImp(AliPHOSGetter)
   
-AliPHOSGetter * AliPHOSGetter::fgObjGetter = 0 ; 
-AliPHOSLoader * AliPHOSGetter::fgPhosLoader = 0;
+AliPHOSGetter   * AliPHOSGetter::fgObjGetter  = 0 ; 
+AliPHOSLoader   * AliPHOSGetter::fgPhosLoader = 0;
+AliPHOSCalibData* AliPHOSGetter::fgCalibData  = 0;
 Int_t AliPHOSGetter::fgDebug = 0;
 
 //  TFile * AliPHOSGetter::fgFile = 0 ; 
@@ -109,6 +114,7 @@ AliPHOSGetter::AliPHOSGetter(const char* headerFile, const char* version, Option
   fESD = 0 ; 
   fESDTree = 0 ; 
   fRawDigits = kFALSE ;
+
 }
 
 //____________________________________________________________________________ 
@@ -163,7 +169,7 @@ AliPHOSClusterizer * AliPHOSGetter::Clusterizer()
 }
 
 //____________________________________________________________________________ 
-TObjArray * AliPHOSGetter::CpvRecPoints() 
+TObjArray * AliPHOSGetter::CpvRecPoints() const
 {
   // asks the Loader to return the CPV RecPoints container 
 
@@ -178,7 +184,7 @@ TObjArray * AliPHOSGetter::CpvRecPoints()
 }
 
 //____________________________________________________________________________ 
-TClonesArray * AliPHOSGetter::Digits() 
+TClonesArray * AliPHOSGetter::Digits() const
 {
   // asks the Loader to return the Digits container 
 
@@ -207,7 +213,7 @@ AliPHOSDigitizer * AliPHOSGetter::Digitizer()
 
 
 //____________________________________________________________________________ 
-TObjArray * AliPHOSGetter::EmcRecPoints() 
+TObjArray * AliPHOSGetter::EmcRecPoints() const
 {
   // asks the Loader to return the EMC RecPoints container 
 
@@ -222,7 +228,7 @@ TObjArray * AliPHOSGetter::EmcRecPoints()
 }
 
 //____________________________________________________________________________ 
-TClonesArray * AliPHOSGetter::TrackSegments() 
+TClonesArray * AliPHOSGetter::TrackSegments() const
 {
   // asks the Loader to return the TrackSegments container 
 
@@ -250,7 +256,7 @@ AliPHOSTrackSegmentMaker * AliPHOSGetter::TrackSegmentMaker()
 }
 
 //____________________________________________________________________________ 
-TClonesArray * AliPHOSGetter::RecParticles() 
+TClonesArray * AliPHOSGetter::RecParticles() const
 {
   // asks the Loader to return the TrackSegments container 
 
@@ -334,7 +340,12 @@ void AliPHOSGetter::Event(AliRawReader *rawReader, const char* opt)
 {
   // Reads the raw event from rawReader
 
+  AliRunLoader * rl = AliRunLoader::GetRunLoader(PhosLoader()->GetTitle());
+  
   if( strstr(opt,"W")  ){
+    rawReader->NextEvent(); 
+    Int_t iEvent = rl->GetEventNumber();
+    rl->GetEvent(iEvent);
     ReadRaw(rawReader) ;
   }    
  
@@ -350,7 +361,7 @@ Int_t AliPHOSGetter::EventNumber() const
 }
 
 //____________________________________________________________________________ 
-  TClonesArray * AliPHOSGetter::Hits()  
+  TClonesArray * AliPHOSGetter::Hits() const
 {
   // asks the loader to return  the Hits container 
   
@@ -550,6 +561,102 @@ Bool_t AliPHOSGetter::OpenESDFile()
   return rv ; 
 }
 
+//____________________________________________________________________________ 
+void AliPHOSGetter::FitRaw(Bool_t lowGainFlag, TGraph * gLowGain, TGraph * gHighGain, TF1* signalF, Double_t & energy, Double_t & time) const
+{
+  // Fits the raw signal time distribution 
+
+  const Int_t kNoiseThreshold = 0 ;
+  Double_t timezero1 = 0., timezero2 = 0., timemax = 0. ;
+  Double_t signal = 0., signalmax = 0. ;       
+  time   = 0. ; 
+  energy = 0. ; 
+
+  if (lowGainFlag) {
+    timezero1 = timezero2 = signalmax = timemax = 0. ;
+    signalF->FixParameter(0, PHOS()->GetRawFormatLowCharge()) ; 
+    signalF->FixParameter(1, PHOS()->GetRawFormatLowGain()) ; 
+    Int_t index ; 
+    for (index = 0; index < PHOS()->GetRawFormatTimeBins(); index++) {
+      gLowGain->GetPoint(index, time, signal) ; 
+      if (signal > kNoiseThreshold && timezero1 == 0.) 
+       timezero1 = time ;
+      if (signal <= kNoiseThreshold && timezero1 > 0. && timezero2 == 0.)
+       timezero2 = time ; 
+      if (signal > signalmax) {
+       signalmax = signal ; 
+       timemax   = time ; 
+      }
+    }
+    signalmax /= PHOS()->RawResponseFunctionMax(PHOS()->GetRawFormatLowCharge(), 
+                                               PHOS()->GetRawFormatLowGain()) ;
+    if ( timezero1 + PHOS()->GetRawFormatTimePeak() < PHOS()->GetRawFormatTimeMax() * 0.4 ) { // else its noise 
+      signalF->SetParameter(2, signalmax) ; 
+      signalF->SetParameter(3, timezero1) ;                
+      gLowGain->Fit(signalF, "QRO", "", 0., timezero2); //, "QRON") ; 
+      energy = signalF->GetParameter(2) ; 
+      time   = signalF->GetMaximumX() - PHOS()->GetRawFormatTimePeak() - PHOS()->GetRawFormatTimeTrigger() ;
+    }
+  } else {
+    timezero1 = timezero2 = signalmax = timemax = 0. ;
+    signalF->FixParameter(0, PHOS()->GetRawFormatHighCharge()) ; 
+    signalF->FixParameter(1, PHOS()->GetRawFormatHighGain()) ; 
+    Int_t index ; 
+    for (index = 0; index < PHOS()->GetRawFormatTimeBins(); index++) {
+      gHighGain->GetPoint(index, time, signal) ;               
+      if (signal > kNoiseThreshold && timezero1 == 0.) 
+       timezero1 = time ;
+      if (signal <= kNoiseThreshold && timezero1 > 0. && timezero2 == 0.)
+       timezero2 = time ; 
+      if (signal > signalmax) {
+       signalmax = signal ;   
+       timemax   = time ; 
+      }
+    }
+    signalmax /= PHOS()->RawResponseFunctionMax(PHOS()->GetRawFormatHighCharge(), 
+                                               PHOS()->GetRawFormatHighGain()) ;;
+    if ( timezero1 + PHOS()->GetRawFormatTimePeak() < PHOS()->GetRawFormatTimeMax() * 0.4 ) { // else its noise  
+      signalF->SetParameter(2, signalmax) ; 
+      signalF->SetParameter(3, timezero1) ;               
+      gHighGain->Fit(signalF, "QRO", "", 0., timezero2) ; 
+      energy = signalF->GetParameter(2) ; 
+      time   = signalF->GetMaximumX() - PHOS()->GetRawFormatTimePeak() - PHOS()->GetRawFormatTimeTrigger() ;
+    }
+  }
+  if (time == 0) energy = 0 ; 
+}
+
+//____________________________________________________________________________ 
+Int_t AliPHOSGetter::CalibrateRaw(Double_t energy, Int_t *relId)
+{
+  // Convert energy into digitized amplitude for a cell relId
+  // It is a user responsilibity to open CDB and set
+  // AliPHOSCalibData object by the following operators:
+  // 
+  // AliCDBLocal *loc = new AliCDBLocal("deCalibDB");
+  // AliPHOSCalibData* clb = (AliPHOSCalibData*)AliCDBStorage::Instance()
+  //    ->Get(path_to_calibdata,run_number);
+  // AliPHOSGetter* gime = AliPHOSGetter::Instance("galice.root");
+  // gime->SetCalibData(clb);
+
+  if (CalibData() == 0)
+    Warning("CalibrateRaw","Calibration DB is not initiated!");
+
+  Int_t   module = relId[0];
+  Int_t   column = relId[3];
+  Int_t   row    = relId[2];
+
+  Float_t gainFactor = 0.0015; // width of one Emc ADC channel in GeV
+  Float_t pedestal   = 0.005;  // Emc pedestals
+
+  if(CalibData()) {
+    gainFactor = CalibData()->GetADCchannelEmc (module,column,row);
+    pedestal   = CalibData()->GetADCpedestalEmc(module,column,row);
+  }
+  
+  Int_t   amp = static_cast<Int_t>( (energy - pedestal) / gainFactor + 0.5 ) ; 
+  return amp;
+}
 //____________________________________________________________________________ 
 Int_t AliPHOSGetter::ReadRaw(AliRawReader *rawReader)
 {
@@ -558,38 +665,87 @@ Int_t AliPHOSGetter::ReadRaw(AliRawReader *rawReader)
 
   AliPHOSRawStream in(rawReader);
  
+  Bool_t first = kTRUE ;
+  
+  TF1 * signalF = new TF1("signal", AliPHOS::RawResponseFunction, 0, PHOS()->GetRawFormatTimeMax(), 4);
+  signalF->SetParNames("Charge", "Gain", "Amplitude", "TimeZero") ; 
+
+  Int_t relId[4], id =0;
+  Bool_t lowGainFlag = kFALSE ; 
+
   TClonesArray * digits = Digits() ;
   digits->Clear() ; 
   Int_t idigit = 0 ; 
+  Int_t amp    = 0 ; 
+  Double_t energy = 0. ; 
+  Double_t time   = 0. ; 
 
-  while ( in.Next() ) { // PHOS entries loop 
-    Int_t amp = in.GetSignal() ; 
-    Double_t time = in.GetTime() ; 
-    Int_t relId[4], id ;
+  TGraph * gLowGain = new TGraph(PHOS()->GetRawFormatTimeBins()) ; 
+  TGraph * gHighGain= new TGraph(PHOS()->GetRawFormatTimeBins()) ;  
+  gLowGain ->SetTitle("Low gain channel");
+  gHighGain->SetTitle("High gain channel");
 
-    relId[0] = in.GetModule() ;
-    if ( relId[0] >= PHOS()->GetRawFormatLowGainOffset() ) { 
-      relId[0] -=  PHOS()->GetRawFormatLowGainOffset() ; 
-    }
-    relId[1] = 0 ; 
-    relId[2] = in.GetRow() ; 
-    relId[3] = in.GetColumn() ; 
-    PHOSGeometry()->RelToAbsNumbering(relId, id) ;     
-    
-    if (amp > 0 && id >=0 ) {
-      new((*digits)[idigit]) AliPHOSDigit( -1, id, amp, time) ;        
-      idigit++ ; 
+  while ( in.Next() ) { // PHOS entries loop 
+    if ( (in.IsNewRow() || in.IsNewColumn() || in.IsNewModule()) ) {
+      if (!first) {
+       FitRaw(lowGainFlag, gLowGain, gHighGain, signalF, energy, time) ; 
+       amp = (Int_t)energy;
+       if (energy > 0) {
+         new((*digits)[idigit]) AliPHOSDigit( -1, id, (Float_t)energy, time) ; 
+         idigit++ ; 
+       }
+       Int_t index ; 
+       for (index = 0; index < PHOS()->GetRawFormatTimeBins(); index++) {
+         gLowGain ->SetPoint(index,
+                             index * PHOS()->GetRawFormatTimeMax() /
+                             PHOS()->GetRawFormatTimeBins(), 0) ;  
+         gHighGain->SetPoint(index,
+                             index * PHOS()->GetRawFormatTimeMax() / 
+                             PHOS()->GetRawFormatTimeBins(), 0) ; 
+       } 
+      }
+      first = kFALSE ; 
+      relId[0] = in.GetModule() ;
+      if ( relId[0] >= PHOS()->GetRawFormatLowGainOffset() ) { 
+       relId[0] -=  PHOS()->GetRawFormatLowGainOffset() ;
+       lowGainFlag = kTRUE ;
+      } else
+       lowGainFlag = kFALSE ;
+      relId[1] = 0 ;
+      relId[2] = in.GetRow() ;
+      relId[3] = in.GetColumn() ;
+      PHOSGeometry()->RelToAbsNumbering(relId, id) ;
     }
-    
+    if (lowGainFlag)
+      gLowGain->SetPoint(in.GetTime(), 
+                        in.GetTime()* PHOS()->GetRawFormatTimeMax() /
+                        PHOS()->GetRawFormatTimeBins(), 
+                        in.GetSignal()) ;
+    else 
+      gHighGain->SetPoint(in.GetTime(), 
+                         in.GetTime() * PHOS()->GetRawFormatTimeMax() /
+                         PHOS()->GetRawFormatTimeBins(), 
+                         in.GetSignal() ) ;
+
   } // PHOS entries loop
-  
+
+  FitRaw(lowGainFlag, gLowGain, gHighGain, signalF, energy, time) ; 
+  amp = (Int_t)energy;
+  if (energy > 0 ) {
+    new((*digits)[idigit]) AliPHOSDigit( -1, id, (Float_t)energy, time) ;
+    idigit++ ; 
+  }
   digits->Sort() ; 
+
+  delete signalF ; 
+  delete gLowGain;
+  delete gHighGain ; 
   
   return digits->GetEntriesFast() ; 
 }
+
 //____________________________________________________________________________ 
-Int_t AliPHOSGetter::ReadTreeD()
+Int_t AliPHOSGetter::ReadTreeD() const
 {
   // Read the Digits
   
@@ -600,7 +756,7 @@ Int_t AliPHOSGetter::ReadTreeD()
 }
 
 //____________________________________________________________________________ 
-Int_t AliPHOSGetter::ReadTreeH()
+Int_t AliPHOSGetter::ReadTreeH() const
 {
   // Read the Hits
   PhosLoader()->CleanHits() ;
@@ -613,7 +769,7 @@ Int_t AliPHOSGetter::ReadTreeH()
 }
 
 //____________________________________________________________________________ 
-Int_t AliPHOSGetter::ReadTreeR()
+Int_t AliPHOSGetter::ReadTreeR() const
 {
   // Read the RecPoints
   
@@ -629,7 +785,7 @@ Int_t AliPHOSGetter::ReadTreeR()
 }
 
 //____________________________________________________________________________ 
-Int_t AliPHOSGetter::ReadTreeT()
+Int_t AliPHOSGetter::ReadTreeT() const
 {
   // Read the TrackSegments
   
@@ -644,7 +800,7 @@ Int_t AliPHOSGetter::ReadTreeT()
   return TrackSegments()->GetEntries() ; 
 }
 //____________________________________________________________________________ 
-Int_t AliPHOSGetter::ReadTreeP()
+Int_t AliPHOSGetter::ReadTreeP() const
 {
   // Read the RecParticles
   
@@ -660,7 +816,7 @@ Int_t AliPHOSGetter::ReadTreeP()
   return RecParticles()->GetEntries() ; 
 }
 //____________________________________________________________________________ 
-Int_t AliPHOSGetter::ReadTreeS()
+Int_t AliPHOSGetter::ReadTreeS() const
 {
   // Read the SDigits
   
@@ -699,7 +855,7 @@ Int_t AliPHOSGetter::ReadTreeE(Int_t event)
 }
 
 //____________________________________________________________________________ 
-TClonesArray * AliPHOSGetter::SDigits() 
+TClonesArray * AliPHOSGetter::SDigits() const
 {
   // asks the Loader to return the Digits container 
 
@@ -905,3 +1061,11 @@ Float_t AliPHOSGetter::BeamEnergy(void) const
   else
     return 0 ;
 }
+//____________________________________________________________________________ 
+
+AliPHOSCalibData* AliPHOSGetter::CalibData()
+{ 
+  // Check if the instance of AliPHOSCalibData exists, and return it
+
+  return fgCalibData;
+}