]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSGetter.cxx
No overlpas with L3 magnet
[u/mrichter/AliRoot.git] / PHOS / AliPHOSGetter.cxx
index 4196794ca6db3539a4a6ee7a60df2a2770af7f3a..bbeb14e091fff254c37259e813c5c2229061dd7c 100644 (file)
 #include "AliPHOSPulseGenerator.h"
 #include "AliRunLoader.h"
 #include "AliStack.h"  
-#include "AliCaloRawStream.h"
+#include "AliPHOSRawDecoder.h"
 #include "AliRawReaderFile.h"
 #include "AliLog.h"
 #include "AliCDBLocal.h"
 #include "AliCDBStorage.h"
 #include "AliCDBManager.h"
+#include "AliPHOSRawDigiProducer.h"
+#include "AliPHOSReconstructor.h"
+#include "AliPHOSRecoParam.h"
 
 ClassImp(AliPHOSGetter)
   
@@ -465,7 +468,7 @@ AliPHOSGetter * AliPHOSGetter::Instance(const char* alirunFileName, const char*
       }
     }
     else {
-      AliRunLoader * rl = AliRunLoader::GetRunLoader(fgPhosLoader->GetTitle()) ; 
+      rl = AliRunLoader::GetRunLoader(fgPhosLoader->GetTitle()) ; 
       if ( strstr(version, AliConfig::GetDefaultEventFolderName()) ) // false in case of merging
        delete rl ; 
       fgObjGetter = new AliPHOSGetter(alirunFileName, version, openingOption) ;      
@@ -543,24 +546,6 @@ AliPHOSPID * AliPHOSGetter::PID()
   return rv ; 
 }
 
-//____________________________________________________________________________ 
-AliPHOSGeometry * AliPHOSGetter::PHOSGeometry() const 
-{
-  // Returns PHOS geometry
-
-  AliPHOSGeometry * rv = 0 ; 
-  if (PHOS() )
-    rv =  PHOS()->GetGeometry() ;
-  else {
-    rv = AliPHOSGeometry::GetInstance();
-    if (!rv) {
-      AliError("Could not find PHOS geometry! Loading the default one !");
-      rv = AliPHOSGeometry::GetInstance("IHEP","");
-    }
-  }
-  return rv ; 
-} 
-
 //____________________________________________________________________________ 
 TClonesArray * AliPHOSGetter::Primaries()  
 {
@@ -640,14 +625,14 @@ void AliPHOSGetter::FitRaw(Bool_t lowGainFlag, TGraph * gLowGain, TGraph * gHigh
   energy = 0. ; 
 
   // Create a shaper pulse object which contains all the shaper parameters
-  AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
+  AliPHOSPulseGenerator pulse;
 
   if (lowGainFlag) {
     timezero1 = timezero2 = signalmax = timemax = 0. ;
-    signalF->FixParameter(0, pulse->GetRawFormatLowCharge()) ; 
-    signalF->FixParameter(1, pulse->GetRawFormatLowGain()) ; 
+    signalF->FixParameter(0, pulse.GetRawFormatLowCharge()) ; 
+    signalF->FixParameter(1, pulse.GetRawFormatLowGain()) ; 
     Int_t index ; 
-    for (index = 0; index < pulse->GetRawFormatTimeBins(); index++) {
+    for (index = 0; index < pulse.GetRawFormatTimeBins(); index++) {
       gLowGain->GetPoint(index, time, signal) ; 
       if (signal > kNoiseThreshold && timezero1 == 0.) 
        timezero1 = time ;
@@ -659,21 +644,21 @@ void AliPHOSGetter::FitRaw(Bool_t lowGainFlag, TGraph * gLowGain, TGraph * gHigh
       }
     }
     signalmax /= 
-      pulse->RawResponseFunctionMax(pulse->GetRawFormatLowCharge(), 
-                                   pulse->GetRawFormatLowGain()) ;
-    if ( timezero1 + pulse->GetRawFormatTimePeak() < pulse->GetRawFormatTimeMax() * 0.4 ) { // else its noise 
+      pulse.RawResponseFunctionMax(pulse.GetRawFormatLowCharge(), 
+                                  pulse.GetRawFormatLowGain()) ;
+    if ( timezero1 + pulse.GetRawFormatTimePeak() < pulse.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() - pulse->GetRawFormatTimePeak() - pulse->GetRawFormatTimeTrigger() ;
+      time   = signalF->GetMaximumX() - pulse.GetRawFormatTimePeak() - pulse.GetRawFormatTimeTrigger() ;
     }
   } else {
     timezero1 = timezero2 = signalmax = timemax = 0. ;
-    signalF->FixParameter(0, pulse->GetRawFormatHighCharge()) ; 
-    signalF->FixParameter(1, pulse->GetRawFormatHighGain()) ; 
+    signalF->FixParameter(0, pulse.GetRawFormatHighCharge()) ; 
+    signalF->FixParameter(1, pulse.GetRawFormatHighGain()) ; 
     Int_t index ; 
-    for (index = 0; index < pulse->GetRawFormatTimeBins(); index++) {
+    for (index = 0; index < pulse.GetRawFormatTimeBins(); index++) {
       gHighGain->GetPoint(index, time, signal) ;               
       if (signal > kNoiseThreshold && timezero1 == 0.) 
        timezero1 = time ;
@@ -684,14 +669,14 @@ void AliPHOSGetter::FitRaw(Bool_t lowGainFlag, TGraph * gLowGain, TGraph * gHigh
        timemax   = time ; 
       }
     }
-    signalmax /= pulse->RawResponseFunctionMax(pulse->GetRawFormatHighCharge(), 
-                                              pulse->GetRawFormatHighGain()) ;;
-    if ( timezero1 + pulse->GetRawFormatTimePeak() < pulse->GetRawFormatTimeMax() * 0.4 ) { // else its noise  
+    signalmax /= pulse.RawResponseFunctionMax(pulse.GetRawFormatHighCharge(), 
+                                             pulse.GetRawFormatHighGain()) ;;
+    if ( timezero1 + pulse.GetRawFormatTimePeak() < pulse.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() - pulse->GetRawFormatTimePeak() - pulse->GetRawFormatTimeTrigger() ;
+      time   = signalF->GetMaximumX() - pulse.GetRawFormatTimePeak() - pulse.GetRawFormatTimeTrigger() ;
     }
   }
   if (time == 0) energy = 0 ; 
@@ -738,136 +723,22 @@ Int_t AliPHOSGetter::ReadRaw(AliRawReader *rawReader,Bool_t isOldRCUFormat)
   // Reimplemented by Boris Polichtchouk (Jul 2006)
   // to make it working with the Jul-Aug 2006 beam test data.
  
-  AliCaloRawStream in(rawReader,"PHOS");
-  in.SetOldRCUFormat(isOldRCUFormat);
-  // Create a shaper pulse object
-  AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
-  TF1 * signalF = new TF1("signal", AliPHOSPulseGenerator::RawResponseFunction, 0, pulse->GetRawFormatTimeMax(), 4);
-  signalF->SetParNames("Charge", "Gain", "Amplitude", "TimeZero") ; 
+  //Create raw decoder.
 
-  Int_t relId[4], absId =0;
-  Bool_t lowGainFlag = kFALSE ; 
+  AliPHOSRawDecoder dc(rawReader);
+  dc.SetOldRCUFormat(isOldRCUFormat);
+  dc.SubtractPedestals(AliPHOSReconstructor::GetRecoParamEmc()->SubtractPedestals());
 
   TClonesArray * digits = Digits() ;
-  digits->Clear() ;
-
-  Int_t    iBin     = 0;
-  Int_t    iDigit   = 0 ; 
-  Double_t energyHG = 0. ; 
-  Double_t energyLG = 0. ; 
-  Double_t time     = 0. ;
-  Int_t    iOldDigit;
-  Bool_t   seen;    
-  TH1F*    hLowGain  = 0;
-  TH1F*    hHighGain = 0;
-
-  while ( in.Next() ) { // PHOS entries loop 
-
-    lowGainFlag = in.IsLowGain();
-
-    // (Re)create histograms to store samples
-
-    if (lowGainFlag) {
-      if(!hLowGain)
-       hLowGain = new TH1F("hLowGain","Low gain",in.GetTimeLength(),0,in.GetTimeLength());
-      else
-       if(hLowGain->GetNbinsX() != in.GetTimeLength()) {
-         delete hLowGain;
-         hLowGain = new TH1F("hLowGain","Low gain",in.GetTimeLength(),0,in.GetTimeLength());
-       }
-    } else {
-      if(!hHighGain)
-       hHighGain = new TH1F("hHighGain","High gain",in.GetTimeLength(),0,in.GetTimeLength());
-      else
-       if(hHighGain->GetNbinsX() != in.GetTimeLength()) {
-         delete hHighGain;
-         hHighGain = new TH1F("hHighGain","High gain",in.GetTimeLength(),0,in.GetTimeLength());
-       }
-    }
-
-    // Fill histograms with samples
-    if(lowGainFlag) 
-      hLowGain ->SetBinContent(in.GetTimeLength()-iBin-1,in.GetSignal());
-    else {
-      hHighGain->SetBinContent(in.GetTimeLength()-iBin-1,in.GetSignal());
-    }
-
-    iBin++;
-
-    // Fit the full sample
-    if(iBin==in.GetTimeLength()) {
-      iBin=0;
-
-      // Temporarily we do not fit the sample graph, but
-      // take the energy from the graph maximum, and the pedestal from the 0th point
-      // 30 Aug 2006
-      
-      //FitRaw(lowGainFlag, hLowGain, hHighGain, signalF, energy, time);
-      
-      if(lowGainFlag) {
-       energyLG  = hLowGain ->GetMaximum();     // "digit amplitude"
-//     energyLG -= hLowGain ->GetBinContent(0); // "pedestal subtraction"
-       energyLG *= pulse->GetRawFormatHighLowGainFactor(); // *16
-       if(AliLog::GetGlobalDebugLevel()>3)
-         AliDebug(4,Form("----Printing hLowGain: ----\n")) ; hLowGain ->Print("all");
-       AliDebug(2,Form("AliPHOSGetter::ReadRaw: (mod,col,row)=(%d,%d,%d), low gain energy=%f\n\n",
-                       in.GetModule(),in.GetColumn(),in.GetRow(),energyLG));
-      }
-
-      else {
-       energyHG  = hHighGain->GetMaximum();     // "digit amplitude"
-//     energyHG -= hHighGain->GetBinContent(0); // "pedestal subtraction"
-       if(AliLog::GetGlobalDebugLevel()>3)
-         AliDebug(4,Form("----Printing hHighGain: ----\n")); hHighGain->Print("all");
-       AliDebug(2,Form("AliPHOSGetter::ReadRaw: (mod,col,row)=(%d,%d,%d), high gain energy=%f\n\n",
-                       in.GetModule(),in.GetColumn(),in.GetRow(),energyHG));
-      }
-
-      // Time is not evaluated for the moment (12.01.2007). To be implemented later.
-      time = -1;
-
-      relId[0] = in.GetModule()+1;
-      relId[1] = 0;
-      relId[2] = in.GetRow();
-      relId[3] = in.GetColumn();
-      if(!PHOSGeometry()) AliFatal("Couldn't find PHOSGeometry!");
-      PHOSGeometry()->RelToAbsNumbering(relId, absId);
-
-      // Add low gain digit only if the high gain digit does not exist in the digits array
-      if(lowGainFlag) {
-       seen = kFALSE;
-       for (iOldDigit=iDigit; iOldDigit=0; iOldDigit--) {
-         if (dynamic_cast<AliPHOSDigit*>(digits->At(iOldDigit))->GetId() == absId) {
-           seen = kTRUE;
-           break;
-         }
-       }
-       if (!seen)
-         new((*digits)[iDigit]) AliPHOSDigit(-1,absId,(Float_t)energyLG,time);
-       energyLG = 0. ; 
-      }
-      // Add high gain digit only if it is not saturated;
-      // replace low gain digit by a high gain one
-      else {
-       if (energyHG >= 1023) continue;
-       for (iOldDigit=iDigit; iOldDigit=0; iOldDigit--) {
-         if (dynamic_cast<AliPHOSDigit*>(digits->At(iOldDigit))->GetId() == absId) {
-           digits->RemoveAt(iOldDigit);
-           new((*digits)[iDigit]) AliPHOSDigit(-1,absId,(Float_t)energyHG,time);
-           break;
-         }
-       }
-       energyHG = 0. ; 
-      }
-      iDigit++;
-    }
+  AliPHOSRawDigiProducer pr;
+  pr.MakeDigits(digits,&dc);
+  
+  //ADC counts -> GeV
+  for(Int_t i=0; i<digits->GetEntries(); i++) {
+    AliPHOSDigit* digit = (AliPHOSDigit*)digits->At(i);
+    digit->SetEnergy(digit->GetEnergy()/AliPHOSPulseGenerator::GeV2ADC());
   }
-
-  // PHOS entries loop
-  digits->Sort() ;
-
+  
   //!!!!for debug!!!
   Int_t modMax=-111;
   Int_t colMax=-111;
@@ -875,10 +746,12 @@ Int_t AliPHOSGetter::ReadRaw(AliRawReader *rawReader,Bool_t isOldRCUFormat)
   Float_t eMax=-333;
   //!!!for debug!!!
 
-  for(iDigit=0; iDigit<digits->GetEntries(); iDigit++) {
+  AliPHOSGeometry * phosgeom =  AliPHOSGeometry::GetInstance() ;
+  Int_t relId[4];
+  for(Int_t iDigit=0; iDigit<digits->GetEntries(); iDigit++) {
     AliPHOSDigit* digit = (AliPHOSDigit*)digits->At(iDigit);
     if(digit->GetEnergy()>eMax) {
-      PHOSGeometry()->AbsToRelNumbering(digit->GetId(),relId);
+      phosgeom->AbsToRelNumbering(digit->GetId(),relId);
       eMax=digit->GetEnergy();
       modMax=relId[0];
       rowMax=relId[2];
@@ -889,10 +762,6 @@ Int_t AliPHOSGetter::ReadRaw(AliRawReader *rawReader,Bool_t isOldRCUFormat)
   AliDebug(1,Form("Digit with max. energy:  modMax %d colMax %d rowMax %d  eMax %f\n\n",
                  modMax,colMax,rowMax,eMax));
 
-  delete signalF ;
-  delete hHighGain;
-  delete hLowGain;
-
   return digits->GetEntriesFast() ; 
 }
 
@@ -929,7 +798,6 @@ Int_t AliPHOSGetter::ReadTreeR() const
   // gets TreeR from the root file (PHOS.RecPoints.root)
   //if ( !IsLoaded("R") ) {
     PhosLoader()->LoadRecPoints("UPDATE") ;
-    PhosLoader()->LoadClusterizer("UPDATE") ;
     //  SetLoaded("R") ; 
     //}