]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - FMD/AliFMDPedestalDA.cxx
coverity #24442, add check on nullness of primary particles pointer
[u/mrichter/AliRoot.git] / FMD / AliFMDPedestalDA.cxx
index bc43b238f86274e6622d41616b0724eaaa917610..956f15d433bb7993198993cc8d085c8340a5c979 100644 (file)
 
 #include "AliFMDPedestalDA.h"
 #include "AliFMDAltroMapping.h"
+#include "AliFMDParameters.h"
+#include "AliFMDCalibPedestal.h"
+#include "AliFMDDigit.h"
+#include "AliLog.h"
 #include <iostream>
 #include <fstream>
-#include "AliLog.h"
-#include "TF1.h"
-#include "TObject.h"
-#include "TMath.h"
+#include <iomanip>
+#include <TFile.h>
+#include <TF1.h>
+#include <TObject.h>
+#include <TMath.h>
 #include <TSystem.h>
+#include <TDatime.h>
+#include <TH2.h>
 
 //_____________________________________________________________________
 ClassImp(AliFMDPedestalDA)
 
 //_____________________________________________________________________
-AliFMDPedestalDA::AliFMDPedestalDA() : AliFMDBaseDA(),
-  fCurrentChannel(1),
-  fPedSummary("PedestalSummary","pedestals",51200,0,51200),
-  fNoiseSummary("NoiseSummary","noise",51200,0,51200),
-  fZSfileFMD1(),
-  fZSfileFMD2(),
-  fZSfileFMD3(), 
-  fMinTimebin(3 * 4 * 3 * 16), // 3 ddls, 4 FECs, 3 Altros, 16 channels
-  fMaxTimebin(3 * 4 * 3 * 16)  // 3 ddls, 4 FECs, 3 Altros, 16 channels
+AliFMDPedestalDA::AliFMDPedestalDA() 
+  : AliFMDBaseDA(),
+    fCurrentChannel(1),
+    fPedSummary("PedestalSummary","pedestals",51200,0,51200),
+    fNoiseSummary("NoiseSummary","noise",51200,0,51200),
+    fZSfileFMD1(),
+    fZSfileFMD2(),
+    fZSfileFMD3(), 
+    fMinTimebin(3 * 4 * 3 * 16), // 3 ddls, 4 FECs, 3 Altros, 16 channels
+    fMaxTimebin(3 * 4 * 3 * 16), // 3 ddls, 4 FECs, 3 Altros, 16 channels
+    fSummaryFMD1i(0),
+    fSummaryFMD2i(0),
+    fSummaryFMD2o(0),
+    fSummaryFMD3i(0),
+    fSummaryFMD3o(0)
 {
   // Default constructor 
+  Rotate("peds.csv", 3);
   fOutputFile.open("peds.csv");
+  Rotate("ddl3072.csv", 10);
   fZSfileFMD1.open("ddl3072.csv");
+  Rotate("ddl3073.csv", 10);
   fZSfileFMD2.open("ddl3073.csv");
+  Rotate("ddl3074.csv", 10);
   fZSfileFMD3.open("ddl3074.csv");  
+  fDiagnosticsFilename = "diagnosticsPedestal.root";
 }
 
 //_____________________________________________________________________
@@ -68,7 +86,12 @@ AliFMDPedestalDA::AliFMDPedestalDA(const AliFMDPedestalDA & pedDA) :
   fZSfileFMD2(),
   fZSfileFMD3(),
   fMinTimebin(pedDA.fMinTimebin),
-  fMaxTimebin(pedDA.fMaxTimebin)
+  fMaxTimebin(pedDA.fMaxTimebin),
+  fSummaryFMD1i(pedDA.fSummaryFMD1i),
+  fSummaryFMD2i(pedDA.fSummaryFMD2i),
+  fSummaryFMD2o(pedDA.fSummaryFMD2o),
+  fSummaryFMD3i(pedDA.fSummaryFMD3i),
+  fSummaryFMD3o(pedDA.fSummaryFMD3o)
 {
   // Copy constructor 
 }
@@ -86,10 +109,12 @@ void AliFMDPedestalDA::Init()
   SetRequiredEvents(1000);
   fMinTimebin.Reset(1024);
   fMaxTimebin.Reset(-1);
+
+
 }
 
 //_____________________________________________________________________
-void AliFMDPedestalDA::AddChannelContainer(TObjArray* sectorArray, 
+void AliFMDPedestalDA::AddChannelContainer(TObjArray* sampleArray, 
                                           UShort_t det, 
                                           Char_t   ring, 
                                           UShort_t sec, 
@@ -105,20 +130,38 @@ void AliFMDPedestalDA::AddChannelContainer(TObjArray* sectorArray,
   //     strip        Strip
   AliFMDParameters* pars        = AliFMDParameters::Instance();
   UInt_t            samples     = pars->GetSampleRate(det, ring, sec, strip);
-  TObjArray*        sampleArray = new TObjArray(samples);
-  sampleArray->SetOwner();
   for (UInt_t sample = 0; sample < samples; sample++) {
-    TH1S* hSample = new TH1S(Form("FMD%d%c[%02d,03%d]_%d",
-                                 det,ring,sec,strip,sample),
-                            Form("FMD%d%c[%02d,%03%d]_%d",
-                                 det,ring,sec,strip),
-                            1024,-.5,1023.5);
+    TString name(Form("FMD%d%c[%02d,%03d]_%d", det,ring,sec,strip,sample));
+    TH1S* hSample = new TH1S(name.Data(),name.Data(), 1024,-.5,1023.5);
     hSample->SetXTitle("ADC");
     hSample->SetYTitle("Events");
     hSample->SetDirectory(0);
-    sampleArray->AddAt(hSample, sample);
+    sampleArray->AddAtAndExpand(hSample, sample);
   }
-  sectorArray->AddAtAndExpand(sampleArray, strip);
+}
+
+//_____________________________________________________________________
+void AliFMDPedestalDA::AddSectorSummary(TObjArray* sectorArray, 
+                                       UShort_t det, 
+                                       Char_t   ring, 
+                                       UShort_t sec, 
+                                       UShort_t nStr) 
+{
+  TH1F* sumPed = new TH1F("Pedestals", 
+                         Form("Summary of pedestals in FMD%d%c[%02d]", 
+                              det, ring, sec), 
+                         nStr, -.5, nStr-.5);
+  sumPed->SetXTitle("Strip");
+  sumPed->SetYTitle("Pedestal [ADC]");
+  sumPed->SetDirectory(0);
+  
+  TH1F* sumNoise = static_cast<TH1F*>(sumPed->Clone("Noise"));
+  sumNoise->SetYTitle("Noise [ADC]");
+  sumNoise->SetDirectory(0);
+  
+  Int_t n = sectorArray->GetEntriesFast();
+  sectorArray->AddAtAndExpand(sumPed,   n + kPedestalOffset - 1);
+  sectorArray->AddAtAndExpand(sumNoise, n + kNoiseOffset - 1);
 }
 
 //_____________________________________________________________________
@@ -137,11 +180,46 @@ void AliFMDPedestalDA::FillChannels(AliFMDDigit* digit)
   UInt_t            samples  = pars->GetSampleRate(det, ring, sec, strip);
   for (UInt_t sample = 0; sample < samples; sample++) {
     TH1S* hSample = GetChannel(det, ring, sec, strip, sample);
+    if (!hSample) continue;
+    
     hSample->Fill(digit->Count(sample));
   }
   
 }
 
+//_____________________________________________________________________
+void AliFMDPedestalDA::MakeSummary(UShort_t det, Char_t ring)
+{
+  //Create summary hists for FMD pedestals
+  // std::cout << "Making summary for FMD" << det << ring << " ..." 
+  //           << std::endl;
+  switch (det) { 
+  case 1: 
+    fSummaryFMD1i = MakeSummaryHistogram("ped", "Pedestals", det, ring);
+    break;
+  case 2:
+    switch (ring) { 
+    case 'I': case 'i':
+      fSummaryFMD2i = MakeSummaryHistogram("ped", "Pedestals", det, ring);
+      break;
+    case 'O': case 'o':
+      fSummaryFMD2o = MakeSummaryHistogram("ped", "Pedestals", det, ring);
+      break;
+    }
+    break;
+  case 3:
+    switch (ring) { 
+    case 'I': case 'i':
+      fSummaryFMD3i = MakeSummaryHistogram("ped", "Pedestals", det, ring);
+      break;
+    case 'O': case 'o':
+      fSummaryFMD3o = MakeSummaryHistogram("ped", "Pedestals", det, ring);
+      break;
+    }
+    break;
+  }
+}
+
 //_____________________________________________________________________
 void AliFMDPedestalDA::Analyse(UShort_t det, 
                               Char_t   ring, 
@@ -157,19 +235,42 @@ void AliFMDPedestalDA::Analyse(UShort_t det,
   //     sec   Sector 
   //     strip Strip.
   AliFMDParameters* pars     = AliFMDParameters::Instance();
+  TH2* summary = 0;
+  switch (det) { 
+  case 1: summary = fSummaryFMD1i; break;
+  case 2: 
+    switch (ring) { 
+    case 'I':  summary = fSummaryFMD2i; break;
+    case 'O':  summary = fSummaryFMD2o; break;
+    }
+    break;
+  case 3:
+    switch (ring) { 
+    case 'I':  summary = fSummaryFMD3i; break;
+    case 'O':  summary = fSummaryFMD3o; break;
+    }
+    break;
+  }
+#if 0
+  static bool first = true;
+  if (summary && first) { 
+    std::cout << "Filling summary " << summary->GetName() << std::endl;
+    first = false;
+  }
+#endif
   // Float_t           factor   = pars->GetPedestalFactor();
   UInt_t            samples  = pars->GetSampleRate(det, ring, sec, strip);
   for (UShort_t sample = 0; sample < samples; sample++) {
   
     TH1S* hChannel = GetChannel(det, ring, sec, strip,sample);
-    if(hChannel->GetEntries() == 0) {
+    if(!hChannel || hChannel->GetEntries() == 0) {
       //AliWarning(Form("No entries for FMD%d%c, sector %d, strip %d",
       //           det,ring,sec,strip));
       return;
     }
     
-    AliDebug(50, Form("Fitting FMD%d%c_%d_%d with %d entries",
-                     det,ring,sec,strip, hChannel->GetEntries()));
+    AliDebug(50, Form("Fitting FMD%d%c[%02d,%03d] with %d entries",
+                     det,ring,sec,strip, int(hChannel->GetEntries())));
     TF1 fitFunc("fitFunc","gausn",0,300);
     fitFunc.SetParameters(100,100,1);
     hChannel->Fit("fitFunc","Q0+","",10,200);
@@ -222,6 +323,8 @@ void AliFMDPedestalDA::Analyse(UShort_t det,
     if      (samples == 2) sampleToWrite = 1;
     else if (samples <  2) sampleToWrite = 0;
     
+    hChannel->GetXaxis()->SetRange(1,1024);
+
     if(sample != sampleToWrite) continue;
     
     
@@ -234,8 +337,17 @@ void AliFMDPedestalDA::Analyse(UShort_t det,
                << fitFunc.GetParameter(1)     << ','
                << fitFunc.GetParameter(2)     << ','
                << chi2ndf                     <<"\n";
-    
+
+    if (summary) { 
+      Int_t bin = summary->FindBin(sec, strip);
+      summary->SetBinContent(bin, mean);
+      summary->SetBinError(bin, rms);
+    }
+
     if(fSaveHistograms  ) {
+      TH1F* sumPed   = GetSectorSummary(det, ring, sec, true);
+      TH1F* sumNoise = GetSectorSummary(det, ring, sec, false);
+#if 0
       gDirectory->cd(GetSectorPath(det, ring, sec, kTRUE));
       TH1F* sumPed   = dynamic_cast<TH1F*>(gDirectory->Get("Pedestals"));
       TH1F* sumNoise = dynamic_cast<TH1F*>(gDirectory->Get("Noise"));
@@ -259,24 +371,29 @@ void AliFMDPedestalDA::Analyse(UShort_t det,
        
        sumNoise->SetDirectory(gDirectory);
       }
+#endif
       sumPed->SetBinContent(strip+1, mean);
       sumPed->SetBinError(strip+1, rms);
       sumNoise->SetBinContent(strip+1, rms);
-      
+
+#if 0
       if(sumNoise->GetEntries() == nStr)
        sumNoise->Write(sumNoise->GetName(),TObject::kOverwrite);
       if(sumPed->GetEntries() == nStr)
        sumPed->Write(sumPed->GetName(),TObject::kOverwrite);
-      
+#endif
       fPedSummary.SetBinContent(fCurrentChannel,mean);
       
       fNoiseSummary.SetBinContent(fCurrentChannel,rms);
       fCurrentChannel++;
-      
+
+#if 0      
       gDirectory->cd(GetStripPath(det, ring, sec, strip, kTRUE));
       hChannel->GetXaxis()->SetRange(1,1024);
       
       hChannel->Write();
+#endif
     }
   }
 }
@@ -286,7 +403,7 @@ void AliFMDPedestalDA::Terminate(TFile* diagFile)
 {
   // Called at the end of a job.  Fills in missing time-bins and
   // closes output files
-  if(fSaveHistograms) {
+  if(fSaveHistograms && diagFile) {
     diagFile->cd();
     
     fPedSummary.Write();
@@ -311,6 +428,9 @@ void AliFMDPedestalDA::Terminate(TFile* diagFile)
 //_____________________________________________________________________
 void AliFMDPedestalDA::FillinTimebins(std::ofstream& out, UShort_t /*ddl*/)
 {
+  // 
+  // Fill missing timebins
+  //
 #if 0
   unsigned short  boards[] = { 0x0, 0x1, 0x10, 0x11, 0xFFFF };
   unsigned short* board    = boards;
@@ -355,9 +475,14 @@ void AliFMDPedestalDA::FillinTimebins(std::ofstream& out, UShort_t /*ddl*/)
 //_____________________________________________________________________
 void AliFMDPedestalDA::WriteHeaderToFile() 
 {
+  //
   // Write headers to output files 
+  //
   AliFMDParameters* pars       = AliFMDParameters::Instance();
   fOutputFile.write(Form("# %s \n",pars->GetPedestalShuttleID()),13);
+  TDatime now;
+  fOutputFile << "# This file created from run # " << fRunno 
+             << " @ " << now.AsString() << std::endl;
   fOutputFile.write("# Detector, "
                    "Ring, "
                    "Sector, "
@@ -369,14 +494,17 @@ void AliFMDPedestalDA::WriteHeaderToFile()
                    "Chi2/NDF \n", 71);
 
   std::ostream* zss[] = { &fZSfileFMD1, &fZSfileFMD2, &fZSfileFMD3, 0 };
-  for (size_t i = 0; i < 3; i++) 
-    *(zss[i]) << "# FMD 1 pedestals \n"
+  for (size_t i = 0; i < 3; i++)  {
+    *(zss[i]) << "# FMD " << (i+1) << " pedestals \n"
              << "# board, "
              << "altro, "
              << "channel, "
              << "timebin, "
              << "pedestal, "
              << "noise\n";
+    *(zss[i]) << "# This file created from run # " << fRunno 
+             << " @ " << now.AsString() << std::endl;
+  }
 }
 
 //_____________________________________________________________________
@@ -397,15 +525,34 @@ TH1S* AliFMDPedestalDA::GetChannel(UShort_t det,
   //
   // Return:
   //     ADC spectra of a strip.
-  UShort_t   iring       = (ring == 'O' ? 0 : 1);
-  TObjArray* detArray    = static_cast<TObjArray*>(fDetectorArray.At(det));
-  TObjArray* ringArray   = static_cast<TObjArray*>(detArray->At(iring));
-  TObjArray* secArray    = static_cast<TObjArray*>(ringArray->At(sec));
-  TObjArray* sampleArray = static_cast<TObjArray*>(secArray->At(strip));
+  TObjArray* sampleArray = GetStripArray(det, ring, sec, strip);
+  if (!sampleArray) return 0;
   TH1S*      hSample     = static_cast<TH1S*>(sampleArray->At(sample));
+  if (!hSample) {
+    AliErrorF("No channel histogram for FMD%d%c[%02d,%03d]_%d", 
+             det, ring, sec, strip, sample);
+    sampleArray->ls();
+    AliErrorF("Path is %s <- %s <- %s <- %s", 
+             sampleArray->GetName(),
+             GetSectorArray(det, ring, sec)->GetName(), 
+             GetRingArray(det, ring)->GetName(),
+             GetDetectorArray(det)->GetName());
+    
+  }
   return hSample;
   
 }
+//_____________________________________________________________________
+TH1F* AliFMDPedestalDA::GetSectorSummary(UShort_t det, 
+                                        Char_t   ring, 
+                                        UShort_t sec, 
+                                        Bool_t   pedNotNoise) 
+{
+  TObjArray* secArray    = GetSectorArray(det, ring, sec);
+  Int_t      n           = secArray->GetEntriesFast();
+  Int_t      i           = n - (pedNotNoise ? kNoiseOffset : kPedestalOffset);
+  return static_cast<TH1F*>(secArray->At(i));
+}
 
 //_____________________________________________________________________
 //