]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCCalibPedestal.cxx
Fixing a possible leak, logics still flawed though...
[u/mrichter/AliRoot.git] / TPC / AliTPCCalibPedestal.cxx
index bce5ce398dd1f731c3ddbe0b414cfd02c7a8f569..c47c8926319c16725e16211e5cd2d4c771ef2cac 100644 (file)
@@ -26,6 +26,7 @@
 #include <TRandom.h>
 #include <TDirectory.h>
 #include <TFile.h>
+#include <TMap.h>
 //AliRoot includes
 #include "AliRawReader.h"
 #include "AliRawReaderRoot.h"
 //
 // - Accessing the calibration storage objects:
 //
-// AliTPCCalROC *GetCalRocPedestal(Int_t sector);  - for the pedestal values
-// AliTPCCalROC *GetCalRocNoise(Int_t sector);     - for the Noise values
+// AliTPCCalROC *GetCalRocPedestal(Int_t sector);  - for the pedestal values, mean from gaus fit
+// AliTPCCalROC *GetCalRocSigma(Int_t sector);     - for the Noise values, sigma from guas fit
+// AliTPCCalROC *GetCalRocMean(Int_t sector);  - for the pedestal values, truncated mean
+// AliTPCCalROC *GetCalRocRMS(Int_t sector);     - for the Noise values, rms from truncated mean
 //
 // example for visualisation:
 // if the file "PedestalData.root" was created using the above example one could do the following:
 // padPedestal->MakeHisto2D()->Draw("colz");  //Draw A-Side Pedestal Information
 // padNoise->MakeHisto2D()->Draw("colz");  //Draw A-Side Noise Information
 //
-
 /*
  example: fill pedestal with gausschen noise
  AliTPCCalibPedestal ped;
  c2->cd(4);
  ped.GetCalRocRMS(36)->Draw("colz");
 */
-
 //
 // Time dependent pedestals:
 //
 
 ClassImp(AliTPCCalibPedestal)
 
-AliTPCCalibPedestal::AliTPCCalibPedestal() : /*FOLD00*/
-  TObject(),
-  fFirstTimeBin(60),
-  fLastTimeBin(1000),
+AliTPCCalibPedestal::AliTPCCalibPedestal() : 
+  AliTPCCalibRawBase(),
   fAdcMin(1),
   fAdcMax(100),
-  fOldRCUformat(kTRUE),
+  fAnaMeanDown(0.),
+  fAnaMeanUp(1.),
   fTimeAnalysis(kFALSE),
-  fROC(AliTPCROC::Instance()),
   fCalRocArrayPedestal(72),
-  fCalRocArrayRMS(72),
+  fCalRocArraySigma(72),
   fHistoPedestalArray(72),
-  fTimeSignal(NULL)
+  fTimeSignal(NULL),
+  fCalRocArrayMean(72),
+  fCalRocArrayRMS(72)
 {
   //
   // default constructor
   //
+  SetNameTitle("AliTPCCalibPedestal","AliTPCCalibPedestal");
+  fFirstTimeBin=60;
+  fLastTimeBin=1000;
 }
 
 
 //_____________________________________________________________________
-AliTPCCalibPedestal::AliTPCCalibPedestal(const AliTPCCalibPedestal &ped) : /*FOLD00*/
-  TObject(ped),
-  fFirstTimeBin(ped.GetFirstTimeBin()),
-  fLastTimeBin(ped.GetLastTimeBin()),
+AliTPCCalibPedestal::AliTPCCalibPedestal(const AliTPCCalibPedestal &ped) : 
+  AliTPCCalibRawBase(ped),
   fAdcMin(ped.GetAdcMin()),
   fAdcMax(ped.GetAdcMax()),
-  fOldRCUformat(ped.fOldRCUformat),
+  fAnaMeanDown(ped.fAnaMeanDown),
+  fAnaMeanUp(ped.fAnaMeanUp),
   fTimeAnalysis(ped.fTimeAnalysis),
-  fROC(AliTPCROC::Instance()),
   fCalRocArrayPedestal(72),
-  fCalRocArrayRMS(72),
+  fCalRocArraySigma(72),
   fHistoPedestalArray(72),
-  fTimeSignal(ped.fTimeSignal)
+  fTimeSignal(ped.fTimeSignal),
+  fCalRocArrayMean(72),
+  fCalRocArrayRMS(72)
 {
   //
   // copy constructor
@@ -251,6 +255,32 @@ AliTPCCalibPedestal::AliTPCCalibPedestal(const AliTPCCalibPedestal &ped) : /*FOL
     }
   }
 }
+AliTPCCalibPedestal::AliTPCCalibPedestal(const TMap *config): 
+  AliTPCCalibRawBase(),
+  fAdcMin(1),
+  fAdcMax(100),
+  fAnaMeanDown(0.),
+  fAnaMeanUp(1.),
+  fTimeAnalysis(kFALSE),
+  fCalRocArrayPedestal(72),
+  fCalRocArraySigma(72),
+  fHistoPedestalArray(72),
+  fTimeSignal(NULL),
+  fCalRocArrayMean(72),
+  fCalRocArrayRMS(72)  
+{
+ //
+ // This constructor uses a TMap for setting some parametes
+ //
+  SetNameTitle("AliTPCCalibPedestal","AliTPCCalibPedestal");
+  fFirstTimeBin=60;
+  fLastTimeBin=1000;
+  if (config->GetValue("FirstTimeBin")) fFirstTimeBin = ((TObjString*)config->GetValue("FirstTimeBin"))->GetString().Atoi();
+  if (config->GetValue("LastTimeBin"))  fLastTimeBin = ((TObjString*)config->GetValue("LastTimeBin"))->GetString().Atoi();
+  if (config->GetValue("AdcMin"))       fAdcMin = ((TObjString*)config->GetValue("AdcMin"))->GetString().Atoi();
+  if (config->GetValue("AdcMax"))       fAdcMax = ((TObjString*)config->GetValue("AdcMax"))->GetString().Atoi();
+  if (config->GetValue("TimeAnalysis")) SetTimeAnalysis(((TObjString*)config->GetValue("TimeAnalysis"))->GetString().Atoi());
+} 
 
 
 //_____________________________________________________________________
@@ -267,7 +297,7 @@ AliTPCCalibPedestal& AliTPCCalibPedestal::operator = (const  AliTPCCalibPedestal
 
 
 //_____________________________________________________________________
-AliTPCCalibPedestal::~AliTPCCalibPedestal() /*FOLD00*/
+AliTPCCalibPedestal::~AliTPCCalibPedestal() 
 {
   //
   // destructor
@@ -275,6 +305,7 @@ AliTPCCalibPedestal::~AliTPCCalibPedestal() /*FOLD00*/
 
   fCalRocArrayPedestal.Delete();
   fCalRocArrayRMS.Delete();
+  fCalRocArraySigma.Delete();
   fHistoPedestalArray.Delete();
 
   if ( fTimeSignal ) {
@@ -285,6 +316,9 @@ AliTPCCalibPedestal::~AliTPCCalibPedestal() /*FOLD00*/
     delete [] fTimeSignal;
     fTimeSignal = 0;
   }
+
+  // do not delete fMapping, because we do not own it.
+
 }
 
 
@@ -321,7 +355,7 @@ void AliTPCCalibPedestal::SetTimeAnalysis(Bool_t time)
 
 
 //_____________________________________________________________________
-Int_t AliTPCCalibPedestal::Update(const Int_t icsector, /*FOLD00*/
+Int_t AliTPCCalibPedestal::Update(const Int_t icsector, 
                                  const Int_t icRow,
                                  const Int_t icPad,
                                  const Int_t icTimeBin,
@@ -330,7 +364,10 @@ Int_t AliTPCCalibPedestal::Update(const Int_t icsector, /*FOLD00*/
   //
   // Signal filling method
   //
-
+  if (icRow<0) return 0;
+  if (icPad<0) return 0;
+  if (icTimeBin<0) return 0;
   // Time dependent pedestals
   if ( fTimeAnalysis ) {
     if ( icsector < 36 ) // IROC
@@ -344,7 +381,7 @@ Int_t AliTPCCalibPedestal::Update(const Int_t icsector, /*FOLD00*/
 
   Int_t iChannel  = fROC->GetRowIndexes(icsector)[icRow]+icPad; //  global pad position in sector
 
-  // fast filling methode.
+  // fast filling method
   // Attention: the entry counter of the histogram is not increased
   //            this means that e.g. the colz draw option gives an empty plot
   Int_t bin = (iChannel+1)*(fAdcMax-fAdcMin+2)+((Int_t)csignal-fAdcMin+1);
@@ -356,107 +393,49 @@ Int_t AliTPCCalibPedestal::Update(const Int_t icsector, /*FOLD00*/
 
 
 //_____________________________________________________________________
-Bool_t AliTPCCalibPedestal::ProcessEvent(AliTPCRawStream *rawStream)
-{
-  //
-  // Event Processing loop - AliTPCRawStream
-  //
-
-  rawStream->SetOldRCUFormat(fOldRCUformat);
-
-  Bool_t withInput = kFALSE;
-
-  while (rawStream->Next()) {
-
-    Int_t iSector  = rawStream->GetSector();      //  current ROC
-    Int_t iRow     = rawStream->GetRow();         //  current row
-    Int_t iPad     = rawStream->GetPad();         //  current pad
-    Int_t iTimeBin = rawStream->GetTime();        //  current time bin
-    Float_t signal = rawStream->GetSignal();      //  current ADC signal
-    
-    Update(iSector,iRow,iPad,iTimeBin,signal);
-    withInput = kTRUE;
-  }
-
-  return withInput;
-}
-
-
-//_____________________________________________________________________
-Bool_t AliTPCCalibPedestal::ProcessEvent(AliRawReader *rawReader)
-{
-  //
-  //  Event processing loop - AliRawReader
-  //
-
-  AliTPCRawStream rawStream(rawReader);
-  rawReader->Select("TPC");
-  return ProcessEvent(&rawStream);
-}
-
-
-//_____________________________________________________________________
-Bool_t AliTPCCalibPedestal::ProcessEvent(eventHeaderStruct *event)
-{
-  //
-  //  process date event
-  //
-
-  AliRawReader *rawReader = new AliRawReaderDate((void*)event);
-  Bool_t result=ProcessEvent(rawReader);
-  delete rawReader;
-  return result;
-}
-
-
-//_____________________________________________________________________
-Bool_t AliTPCCalibPedestal::TestEvent() /*FOLD00*/
+Bool_t AliTPCCalibPedestal::TestEvent() 
 {
   //
   //  Test event loop
   // fill one oroc and one iroc with random gaus
   //
 
-    gRandom->SetSeed(0);
-
-    for (UInt_t iSec=0; iSec<72; ++iSec){
-        if (iSec%36>0) continue;
-       for (UInt_t iRow=0; iRow < fROC->GetNRows(iSec); ++iRow){
-           for (UInt_t iPad=0; iPad < fROC->GetNPads(iSec,iRow); ++iPad){
-               for (UInt_t iTimeBin=0; iTimeBin<1024; ++iTimeBin){
-                   Float_t signal=(Int_t)(iRow+3+gRandom->Gaus(0,.7));
-                   if ( signal>0 )Update(iSec,iRow,iPad,iTimeBin,signal);
-               }
-           }
-       }
+  gRandom->SetSeed(0);
+
+  for (UInt_t iSec=0; iSec<72; ++iSec){
+    if (iSec%36>0) continue;
+    for (UInt_t iRow=0; iRow < fROC->GetNRows(iSec); ++iRow){
+      for (UInt_t iPad=0; iPad < fROC->GetNPads(iSec,iRow); ++iPad){
+        for (UInt_t iTimeBin=0; iTimeBin<1024; ++iTimeBin){
+          Float_t signal=(Int_t)(iRow+3+gRandom->Gaus(0,.7));
+          if ( signal>0 )Update(iSec,iRow,iPad,iTimeBin,signal);
+        }
+      }
     }
-    return kTRUE;
+  }
+  return kTRUE;
 }
 
 
 //_____________________________________________________________________
-TH2F* AliTPCCalibPedestal::GetHisto(Int_t sector, TObjArray *arr, /*FOLD00*/
-                                 Int_t nbinsY, Float_t ymin, Float_t ymax,
-                                 Char_t *type, Bool_t force)
+TH2F* AliTPCCalibPedestal::GetHisto(Int_t sector, TObjArray *arr, 
+                                   Int_t nbinsY, Float_t ymin, Float_t ymax,
+                                   const Char_t *type, Bool_t force)
 {
     //
     // return pointer to Q histogram
     // if force is true create a new histogram if it doesn't exist allready
     //
     if ( !force || arr->UncheckedAt(sector) )
-       return (TH2F*)arr->UncheckedAt(sector);
+      return (TH2F*)arr->UncheckedAt(sector);
 
     // if we are forced and histogram doesn't yes exist create it
-    Char_t name[255], title[255];
-
-    sprintf(name,"hCalib%s%.2d",type,sector);
-    sprintf(title,"%s calibration histogram sector %.2d;ADC channel;Channel (pad)",type,sector);
-
     // new histogram with Q calib information. One value for each pad!
-    TH2F* hist = new TH2F(name,title,
-                         nbinsY, ymin, ymax,
-                         fROC->GetNChannels(sector),0,fROC->GetNChannels(sector)
-                        );
+    TH2F* hist = new TH2F(Form("hCalib%s%.2d",type,sector),
+                          Form("%s calibration histogram sector %.2d;ADC channel;Channel (pad)",type,sector),
+                          nbinsY, ymin, ymax,
+                          fROC->GetNChannels(sector),0,fROC->GetNChannels(sector)
+                         );
     hist->SetDirectory(0);
     arr->AddAt(hist,sector);
     return hist;
@@ -464,7 +443,7 @@ TH2F* AliTPCCalibPedestal::GetHisto(Int_t sector, TObjArray *arr, /*FOLD00*/
 
 
 //_____________________________________________________________________
-TH2F* AliTPCCalibPedestal::GetHistoPedestal(Int_t sector, Bool_t force) /*FOLD00*/
+TH2F* AliTPCCalibPedestal::GetHistoPedestal(Int_t sector, Bool_t force) 
 {
     //
     // return pointer to T0 histogram
@@ -476,7 +455,7 @@ TH2F* AliTPCCalibPedestal::GetHistoPedestal(Int_t sector, Bool_t force) /*FOLD00
 
 
 //_____________________________________________________________________
-AliTPCCalROC* AliTPCCalibPedestal::GetCalRoc(Int_t sector, TObjArray* arr, Bool_t force) /*FOLD00*/
+AliTPCCalROC* AliTPCCalibPedestal::GetCalRoc(Int_t sector, TObjArray* arr, Bool_t force) 
 {
     //
     // return pointer to ROC Calibration
@@ -495,10 +474,10 @@ AliTPCCalROC* AliTPCCalibPedestal::GetCalRoc(Int_t sector, TObjArray* arr, Bool_
 
 
 //_____________________________________________________________________
-AliTPCCalROC* AliTPCCalibPedestal::GetCalRocPedestal(Int_t sector, Bool_t force) /*FOLD00*/
+AliTPCCalROC* AliTPCCalibPedestal::GetCalRocPedestal(Int_t sector, Bool_t force) 
 {
     //
-    // return pointer to Carge ROC Calibration
+    // return pointer to ROC with Pedestal data
     // if force is true create a new histogram if it doesn't exist allready
     //
     TObjArray *arr = &fCalRocArrayPedestal;
@@ -507,49 +486,93 @@ AliTPCCalROC* AliTPCCalibPedestal::GetCalRocPedestal(Int_t sector, Bool_t force)
 
 
 //_____________________________________________________________________
-AliTPCCalROC* AliTPCCalibPedestal::GetCalRocRMS(Int_t sector, Bool_t force) /*FOLD00*/
+AliTPCCalROC* AliTPCCalibPedestal::GetCalRocSigma(Int_t sector, Bool_t force) 
 {
     //
-    // return pointer to signal width ROC Calibration
+    // return pointer to  ROC with signal witdth in sigma
     // if force is true create a new histogram if it doesn't exist allready
     //
-    TObjArray *arr = &fCalRocArrayRMS;
+    TObjArray *arr = &fCalRocArraySigma;
     return GetCalRoc(sector, arr, force);
 }
+//_____________________________________________________________________
+AliTPCCalROC* AliTPCCalibPedestal::GetCalRocMean(Int_t sector, Bool_t force)
+{
+  //
+    // return pointer to ROC with signal mean information
+    // if force is true create a new histogram if it doesn't exist allready
+  //
+  TObjArray *arr = &fCalRocArrayMean;
+  return GetCalRoc(sector, arr, force);
+}
+
+//_____________________________________________________________________
+AliTPCCalROC* AliTPCCalibPedestal::GetCalRocRMS(Int_t sector, Bool_t force) 
+{
+  //
+    // return pointer to signal width ROC Calibration
+    // if force is true create a new histogram if it doesn't exist allready
+  //
+  TObjArray *arr = &fCalRocArrayRMS;
+  return GetCalRoc(sector, arr, force);
+}
 
 
 //_____________________________________________________________________
-void AliTPCCalibPedestal::Merge(AliTPCCalibPedestal *ped)
+void AliTPCCalibPedestal::Merge(AliTPCCalibPedestal * const ped)
 {
   //
   //  Merge reference histograms of sig to the current AliTPCCalibSignal
   //
-
+  MergeBase(ped);
   // merge histograms
   for (Int_t iSec=0; iSec<72; ++iSec){
     TH2F *hRefPedMerge   = ped->GetHistoPedestal(iSec);
-
+    
     if ( hRefPedMerge ){
       TDirectory *dir = hRefPedMerge->GetDirectory(); hRefPedMerge->SetDirectory(0);
       TH2F *hRefPed   = GetHistoPedestal(iSec);
       if ( hRefPed ) hRefPed->Add(hRefPedMerge);
       else {
-       TH2F *hist = new TH2F(*hRefPedMerge);
-       hist->SetDirectory(0);
-       fHistoPedestalArray.AddAt(hist, iSec);
+        TH2F *hist = new TH2F(*hRefPedMerge);
+        hist->SetDirectory(0);
+        fHistoPedestalArray.AddAt(hist, iSec);
       }
       hRefPedMerge->SetDirectory(dir);
     }
   }
-
+  
   // merge array
   // ...
-
+  
 }
 
+//_____________________________________________________________________
+Long64_t AliTPCCalibPedestal::Merge(TCollection * const list)
+{
+  //
+  // Merge all objects of this type in list
+  //
+  
+  Long64_t nmerged=1;
+  
+  TIter next(list);
+  AliTPCCalibPedestal *ce=0;
+  TObject *o=0;
+  
+  while ( (o=next()) ){
+    ce=dynamic_cast<AliTPCCalibPedestal*>(o);
+    if (ce){
+      Merge(ce);
+      ++nmerged;
+    }
+  }
+  
+  return nmerged;
+}
 
 //_____________________________________________________________________
-void AliTPCCalibPedestal::Analyse() /*FOLD00*/
+void AliTPCCalibPedestal::Analyse() 
 {
   //
   //  Calculate calibration constants
@@ -557,33 +580,53 @@ void AliTPCCalibPedestal::Analyse() /*FOLD00*/
 
   Int_t nbinsAdc = fAdcMax-fAdcMin;
 
-  TVectorD param(3);
+  TVectorD param(4);
   TMatrixD dummy(3,3);
 
-  Float_t *array_hP=0;  
+  TH1F *hChannel=new TH1F("hChannel","hChannel",nbinsAdc,fAdcMin,fAdcMax);
+  
+  Float_t *arrayhP=0;  
 
   for (Int_t iSec=0; iSec<72; ++iSec){
     TH2F *hP = GetHistoPedestal(iSec);
     if ( !hP ) continue;
 
     AliTPCCalROC *rocPedestal = GetCalRocPedestal(iSec,kTRUE);
+    AliTPCCalROC *rocSigma    = GetCalRocSigma(iSec,kTRUE);
+    AliTPCCalROC *rocMean     = GetCalRocMean(iSec,kTRUE);
     AliTPCCalROC *rocRMS      = GetCalRocRMS(iSec,kTRUE);
 
-    array_hP = hP->GetArray();
+    arrayhP = hP->GetArray();
     UInt_t nChannels = fROC->GetNChannels(iSec);
 
     for (UInt_t iChannel=0; iChannel<nChannels; ++iChannel){
       Int_t offset = (nbinsAdc+2)*(iChannel+1)+1;
-      Double_t ret = AliMathBase::FitGaus(array_hP+offset,nbinsAdc,fAdcMin,fAdcMax,&param,&dummy);
+      //calculate mean and sigma using a gaus fit
+      //Double_t ret =
+      AliMathBase::FitGaus(arrayhP+offset,nbinsAdc,fAdcMin,fAdcMax,&param,&dummy);
       // if the fitting failed set noise and pedestal to 0
-      if ( ret == -4 ) {
-       param[1]=0;
-       param[2]=0;
+      // is now done in AliMathBase::FitGaus !
+//       if ( ret == -4 ) {
+//     param[1]=0;
+//     param[2]=0;
+//       }
+      if ( param[1]<fAdcMin || param[1]>fAdcMax ){
+        param[1]=0;
+        param[2]=0;
       }
       rocPedestal->SetValue(iChannel,param[1]);
+      rocSigma->SetValue(iChannel,param[2]);
+      //calculate mean and RMS using a truncated means
+      hChannel->Set(nbinsAdc+2,arrayhP+offset-1);
+      hChannel->SetEntries(param[3]);
+      param[1]=0;
+      param[2]=0;
+      if ( param[3]>0 ) AliMathBase::TruncatedMean(hChannel,&param,fAnaMeanDown,fAnaMeanUp);
+      rocMean->SetValue(iChannel,param[1]);
       rocRMS->SetValue(iChannel,param[2]);
     }
   }
+  delete hChannel;
 }
 
 
@@ -607,32 +650,3 @@ void AliTPCCalibPedestal::AnalyseTime(Int_t nevents)
     }
   }
 }
-
-
-//_____________________________________________________________________
-void AliTPCCalibPedestal::DumpToFile(const Char_t *filename, const Char_t *dir, Bool_t append) /*FOLD00*/
-{
-  //
-  //  Write class to file
-  //
-
-  TString sDir(dir);
-  TString option;
-
-  if ( append )
-    option = "update";
-  else
-    option = "recreate";
-
-  TDirectory *backup = gDirectory;
-  TFile f(filename,option.Data());
-  f.cd();
-  if ( !sDir.IsNull() ){
-    f.mkdir(sDir.Data());
-    f.cd(sDir);
-  }
-  this->Write();
-  f.Close();
-
-  if ( backup ) backup->cd();
-}