]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - FMD/AliFMDGainDA.cxx
Plotting macro updates
[u/mrichter/AliRoot.git] / FMD / AliFMDGainDA.cxx
index d4b285107808a491c78b7fb760b534d10b699293..b00cfc80496c5d03719851e5d92d5984be67dbfb 100644 (file)
 // pulse and the response of the detector.
 //
 #include "AliFMDGainDA.h"
-#include "iostream"
-#include "fstream"
-#include "AliLog.h"
-#include "TF1.h"
-#include "TH1.h"
-#include "TMath.h"
-#include "TGraphErrors.h"
-#include "AliFMDParameters.h"
 #include "AliFMDAltroMapping.h"
+#include "AliFMDParameters.h"
+#include "AliFMDCalibGain.h"
+#include "AliFMDDigit.h"
+#include "AliLog.h"
+#include <TFile.h>
+#include <TF1.h>
+#include <TH1S.h>
+#include <TGraphErrors.h>
+#include <TDatime.h>
+#include <TH2.h>
 
 //_____________________________________________________________________
 ClassImp(AliFMDGainDA)
@@ -48,33 +50,59 @@ ClassImp(AliFMDGainDA)
 //_____________________________________________________________________
 AliFMDGainDA::AliFMDGainDA() 
   : AliFMDBaseDA(),
-    fGainArray(),
     fHighPulse(256), 
     fEventsPerChannel(10),
     fCurrentPulse(10),
     fCurrentChannel(10),
     fNumberOfStripsPerChip(128),
     fSummaryGains("GainsSummary","Summary of gains",51200,0,51200),
-    fCurrentSummaryStrip(1)
+    fCurrentSummaryStrip(1),
+    fGainFMD1i(0),
+    fGainFMD2i(0),
+    fGainFMD2o(0),
+    fGainFMD3i(0),
+    fGainFMD3o(0),
+    fChi2FMD1i(0),
+    fChi2FMD2i(0),
+    fChi2FMD2o(0),
+    fChi2FMD3i(0),
+    fChi2FMD3o(0)
 {
+  // Constructor 
+  // 
+  // Parameters: 
+  //   None
   fCurrentPulse.Reset(0);
   fCurrentChannel.Reset(0);
   fOutputFile.open("gains.csv");
-  fGainArray.SetOwner(); 
+  fDiagnosticsFilename = "diagnosticsGain.root";
 }
 
 //_____________________________________________________________________
 AliFMDGainDA::AliFMDGainDA(const AliFMDGainDA & gainDA) 
-  :  AliFMDBaseDA(gainDA),
-     fGainArray(gainDA.fGainArray),
-     fHighPulse(gainDA.fHighPulse),
-     fEventsPerChannel(gainDA.fEventsPerChannel),
-     fCurrentPulse(gainDA.fCurrentPulse),
-     fCurrentChannel(gainDA.fCurrentChannel),
-     fNumberOfStripsPerChip(gainDA.fNumberOfStripsPerChip),
-     fSummaryGains(gainDA.fSummaryGains),
-     fCurrentSummaryStrip(gainDA.fCurrentSummaryStrip)
+  : AliFMDBaseDA(gainDA),
+    fHighPulse(gainDA.fHighPulse),
+    fEventsPerChannel(gainDA.fEventsPerChannel),
+    fCurrentPulse(gainDA.fCurrentPulse),
+    fCurrentChannel(gainDA.fCurrentChannel),
+    fNumberOfStripsPerChip(gainDA.fNumberOfStripsPerChip),
+    fSummaryGains(gainDA.fSummaryGains),
+    fCurrentSummaryStrip(gainDA.fCurrentSummaryStrip),
+    fGainFMD1i(gainDA.fGainFMD1i),
+    fGainFMD2i(gainDA.fGainFMD2i),
+    fGainFMD2o(gainDA.fGainFMD2o),
+    fGainFMD3i(gainDA.fGainFMD3i),
+    fGainFMD3o(gainDA.fGainFMD3o),
+    fChi2FMD1i(gainDA.fChi2FMD1i),
+    fChi2FMD2i(gainDA.fChi2FMD2i),
+    fChi2FMD2o(gainDA.fChi2FMD2o),
+    fChi2FMD3i(gainDA.fChi2FMD3i),
+    fChi2FMD3o(gainDA.fChi2FMD3o)
 {  
+  // Copy Constructor 
+  // 
+  // Parameters: 
+  //   gainDA   Object to copy from 
   fCurrentPulse.Reset(0);
   fCurrentChannel.Reset(0);
 }
@@ -82,64 +110,58 @@ AliFMDGainDA::AliFMDGainDA(const AliFMDGainDA & gainDA)
 //_____________________________________________________________________
 AliFMDGainDA::~AliFMDGainDA() 
 {
+  // Destructor 
+  // 
+  // Parameters: 
+  //   None
 }
 
 //_____________________________________________________________________
 void AliFMDGainDA::Init() 
 {
-  
+  // Initialize 
+  // 
+  // Parameters: 
+  //   None
   Int_t nEventsRequired = 0;
   
-  //for(UShort_t det=1; det<=3;det++) {
-  //  UShort_t firstring = (det == 1 ? 1 : 0);
-  //  for(UShort_t iring = firstring; iring <=1;iring++) {
-  //    Char_t ring = (iring == 1 ? 'I' : 'O');
-  //    for(UShort_t board =0 ; board <=1; board++) {
-  //   Int_t idx = GetHalfringIndex(det,ring,board);
-  for(Int_t idx = 0;idx<fEventsPerChannel.GetSize();idx++)
-    {
-      
-      Int_t nEvents = 0;
-      if(fPulseSize.At(idx))
-       nEvents = (fPulseLength.At(idx)*fHighPulse) / fPulseSize.At(idx);
-      fEventsPerChannel.AddAt(nEvents,idx);
-      if(nEvents>nEventsRequired) nEventsRequired = nEvents * fNumberOfStripsPerChip;
-      
-    }
-  //}
-  // }
-  
-  //8 pulser values * 128 strips * 100 samples
-  
-  
+  for(Int_t idx = 0;idx<fEventsPerChannel.GetSize();idx++) {
+    Int_t nEvents = 0;
+    if(fPulseSize.At(idx))
+      nEvents = (fPulseLength.At(idx)*fHighPulse) / fPulseSize.At(idx);
+    fEventsPerChannel.AddAt(nEvents,idx);
+    if(nEvents>nEventsRequired) 
+      nEventsRequired = nEvents * fNumberOfStripsPerChip;    
+  }
   SetRequiredEvents(nEventsRequired); 
-  
-  TObjArray* detArray;
-  TObjArray* ringArray;
-  TObjArray* sectorArray;
+}
+
+//_____________________________________________________________________
+void AliFMDGainDA::InitContainer(TDirectory* dir) 
+{
+  AliFMDBaseDA::InitContainer(dir);
   
   for(UShort_t det=1;det<=3;det++) {
-    detArray = new TObjArray();
-    detArray->SetOwner();
-    fGainArray.AddAtAndExpand(detArray,det);
-    for (UShort_t ir = 0; ir < 2; ir++) {
+    UShort_t sr = (det == 1 ? 1 : 0);
+    for (UShort_t ir = sr; ir < 2; ir++) {
       Char_t   ring = (ir == 0 ? 'O' : 'I');
       UShort_t nsec = (ir == 0 ? 40  : 20);
-      UShort_t nstr = (ir == 0 ? 2 : 4);
-      ringArray = new TObjArray();
-      ringArray->SetOwner();
-      detArray->AddAtAndExpand(ringArray,ir);
+      UShort_t nva  = (ir == 0 ? 2 : 4);
       for(UShort_t sec =0; sec < nsec;  sec++)  {
-       sectorArray = new TObjArray();
-       sectorArray->SetOwner();
-       ringArray->AddAtAndExpand(sectorArray,sec);
-       for(UShort_t strip = 0; strip < nstr; strip++) {
-         TH1S* hChannel = new TH1S(Form("hFMD%d%c_%d_%d",det,ring,sec,strip),
-                                   Form("hFMD%d%c_%d_%d",det,ring,sec,strip),
-                                   1024,0,1023);
+       TObjArray* sectorArray = GetSectorArray(det, ring, sec);
+       TObjArray* cache = new TObjArray(nva);
+       cache->SetName("Cache");
+       cache->SetOwner();
+       Int_t n = sectorArray->GetEntriesFast();
+       sectorArray->AddAtAndExpand(cache, n);
+       for(UShort_t va = 0; va < nva; va++) {
+         TH1S* hChannel = new TH1S(Form("FMD%d%c[%02d]_va%d",
+                                        det,ring,sec,va),
+                                   Form("FMD%d%c[%02d] VA%d Cache",
+                                        det,ring,sec,va),
+                                   1024,-.5,1023.5);
          hChannel->SetDirectory(0);
-         sectorArray->AddAtAndExpand(hChannel,strip);
+         cache->AddAtAndExpand(hChannel,va);
        }
       }
     }
@@ -147,45 +169,132 @@ void AliFMDGainDA::Init()
 }
 
 //_____________________________________________________________________
-void AliFMDGainDA::AddChannelContainer(TObjArray* sectorArray, 
+void AliFMDGainDA::AddChannelContainer(TObjArray* stripArray, 
                                       UShort_t det  , 
                                       Char_t   ring,  
                                       UShort_t sec, 
                                       UShort_t strip) 
 {  
-  TGraphErrors* hChannel  = new TGraphErrors();
-  hChannel->SetName(Form("FMD%d%c[%02d,%03d]", det, ring, sec, strip));
-  hChannel->SetTitle(Form("FMD%d%c[%02d,%03d] ADC vs DAC", 
+  // Make a channel container 
+  // 
+  // Parameters: 
+  //  sectorArray    Sectors 
+  //  det            Detector number
+  //  ring           Ring identifier 
+  //  sec            Sector number
+  //  strip          Strip number
+
+  AliFMDParameters* pars     = AliFMDParameters::Instance();
+  UShort_t          board    = pars->GetAltroMap()->Sector2Board(ring, sec);
+  Int_t             halfring = GetHalfringIndex(det,ring,board/16);
+  Int_t             dPulse   = fPulseSize.At(halfring);
+  Int_t             nPulses  = dPulse > 0 ? fHighPulse / dPulse : 0;
+
+  TGraphErrors* gChannel  = new TGraphErrors(nPulses);
+  gChannel->SetName(Form("FMD%d%c[%02d,%03d]", det, ring, sec, strip));
+  gChannel->SetTitle(Form("FMD%d%c[%02d,%03d] ADC vs DAC", 
                          det, ring, sec, strip));
-  sectorArray->AddAtAndExpand(hChannel,strip);
+  stripArray->AddAtAndExpand(gChannel,0);
+}
+
+//_____________________________________________________________________
+void AliFMDGainDA::AddSectorSummary(TObjArray* sectorArray, 
+                                   UShort_t det, 
+                                   Char_t   ring, 
+                                   UShort_t sec, 
+                                   UShort_t nStr) 
+{
+  TH1F* summary = new TH1F("Summary", Form("Summary of gains in FMD%d%c[%02d]", 
+                                          det, ring, sec), 
+                          nStr, -.5, nStr-.5);
+  summary->SetXTitle("Strip");
+  summary->SetYTitle("Gain [ADC/DAC]");
+  summary->SetDirectory(0);
+
+  Int_t n = sectorArray->GetEntriesFast();
+  sectorArray->AddAtAndExpand(summary, n);
 }
 
 //_____________________________________________________________________
-void AliFMDGainDA::FillChannels(AliFMDDigit* digit) {
+void AliFMDGainDA::FillChannels(AliFMDDigit* digit) 
+{
+  // Fill data into histogram
+  // 
+  // Parameters: 
+  //   digit  Digit to get the data from
 
   UShort_t det   = digit->Detector();
   Char_t   ring  = digit->Ring();
   UShort_t sec   = digit->Sector();
   UShort_t strip = digit->Strip();
   
-  //Strip is always seen as the first in a VA chip. All other strips are junk
-  if(strip % fNumberOfStripsPerChip) return;
-  Int_t vaChip   = strip / fNumberOfStripsPerChip; 
-  TH1S* hChannel = GetChannelHistogram(det, ring, sec, vaChip);
+  //Strip is always seen as the first in a VA chip. All other strips are junk.
+  //Strips are counted from zero on even sectors and from 511 on odd sectors...
+   
+  if((sec%2)     && ((strip+1) % fNumberOfStripsPerChip)) return;
+  if(((sec+1)%2) && (strip % fNumberOfStripsPerChip)) return;
   
+  UShort_t vaChip   = strip / fNumberOfStripsPerChip; 
+  TH1S*    hChannel = GetChannelHistogram(det, ring, sec, vaChip);
   hChannel->Fill(digit->Counts());
   UpdatePulseAndADC(det,ring,sec,strip);
 }
 
+//_____________________________________________________________________
+void AliFMDGainDA::MakeSummary(UShort_t det, Char_t ring)
+{
+  // 
+  // Create summary hists for FMD gains and chi2 of the fits
+  //
+  switch (det) { 
+  case 1: 
+    fGainFMD1i = MakeSummaryHistogram("gain", "Gains", det, ring);
+    fChi2FMD1i = MakeSummaryHistogram("chi2", "#Chi^{2}/NDF", det, ring);
+    break;
+  case 2:
+    switch (ring) { 
+    case 'I': case 'i':
+      fGainFMD2i = MakeSummaryHistogram("gain", "Gains", det, ring);
+      fChi2FMD2i = MakeSummaryHistogram("chi2", "#Chi^{2}/NDF", det, ring);
+      break;
+    case 'O': case 'o':
+      fGainFMD2o = MakeSummaryHistogram("gain", "Gains", det, ring);
+      fChi2FMD2o = MakeSummaryHistogram("chi2", "#Chi^{2}/NDF", det, ring);
+      break;
+    }
+    break;
+  case 3:
+    switch (ring) { 
+    case 'I': case 'i':
+      fGainFMD3i = MakeSummaryHistogram("gain", "Gains", det, ring);
+      fChi2FMD3i = MakeSummaryHistogram("chi2", "#Chi^{2}/NDF", det, ring);
+      break;
+    case 'O': case 'o':
+      fGainFMD3o = MakeSummaryHistogram("gain", "Gains", det, ring);
+      fChi2FMD3o = MakeSummaryHistogram("chi2", "#Chi^{2}/NDF", det, ring);
+      break;
+    }
+    break;
+  }
+}
+
 //_____________________________________________________________________
 void AliFMDGainDA::Analyse(UShort_t det, 
                           Char_t   ring, 
                           UShort_t sec, 
-                          UShort_t strip) {
+                          UShort_t strip) 
+{
+  // Analyse result of a single strip
+  // 
+  // Parameters: 
+  //  det            Detector number
+  //  ring           Ring identifier 
+  //  sec            Sector number
+  //  strip          Strip number
   TGraphErrors* grChannel = GetChannel(det,ring,sec,strip);
   if(!grChannel->GetN()) {
-    // AliWarning(Form("No entries for FMD%d%c, sector %d, strip %d",
-    //                 det, ring , sec, strip));
+    AliWarning(Form("No entries for FMD%d%c, sector %d, strip %d",
+                     det, ring , sec, strip));
     return;
   }
   TF1 fitFunc("fitFunc","pol1",-10,280); 
@@ -211,75 +320,96 @@ void AliFMDGainDA::Analyse(UShort_t det,
              << chi2ndf                     <<"\n";
   
   //due to RCU trouble, first strips on VAs are excluded
-  if(strip%128 != 0) {
-    
-    fSummaryGains.SetBinContent(fCurrentSummaryStrip,fitFunc.GetParameter(1));
-    fSummaryGains.SetBinError(fCurrentSummaryStrip,fitFunc.GetParError(1));
+  // if(strip%128 != 0) {
     
-    fCurrentSummaryStrip++;
+  fSummaryGains.SetBinContent(fCurrentSummaryStrip,fitFunc.GetParameter(1));
+  fSummaryGains.SetBinError(fCurrentSummaryStrip,fitFunc.GetParError(1));
+  
+  fCurrentSummaryStrip++;
+
+  TH2* hGain = 0;
+  TH2* hChi2 = 0;
+  switch (det) { 
+  case 1: hGain = fGainFMD1i; hChi2 = fChi2FMD1i; break;
+  case 2: 
+    switch (ring) { 
+    case 'I':  hGain = fGainFMD2i; hChi2 = fChi2FMD2i; break;
+    case 'O':  hGain = fGainFMD2o; hChi2 = fChi2FMD2o; break;
+    }
+    break;
+  case 3:
+    switch (ring) { 
+    case 'I':  hGain = fGainFMD3i; hChi2 = fChi2FMD3i; break;
+    case 'O':  hGain = fGainFMD3o; hChi2 = fChi2FMD3o; break;
+    }
+    break;
+  }
+  if (hGain && hChi2) {
+    Int_t bin = hGain->FindBin(sec, strip);
+    hGain->SetBinContent(bin, gain);
+    hGain->SetBinError(bin, error);
+    hChi2->SetBinContent(bin, chi2ndf);
   }
+
+    // }
   if(fSaveHistograms) {
-    gDirectory->cd(GetSectorPath(det,ring, sec, kTRUE));
-    
-    TH1F* summary = dynamic_cast<TH1F*>(gDirectory->Get("Summary"));
-    if (!summary) { 
-      Int_t nStr = (ring == 'I' ? 512 : 256);
-      summary = new TH1F("Summary", Form("Summary of gains in FMD%d%c[%02d]", 
-                                        det, ring, sec), 
-                        nStr, -.5, nStr-.5);
-      summary->SetXTitle("Strip");
-      summary->SetYTitle("Gain [ADC/DAC]");
-      summary->SetDirectory(gDirectory);
-    }
+    TH1F* summary = GetSectorSummary(det, ring, sec);
     summary->SetBinContent(strip+1, fitFunc.GetParameter(1));
     summary->SetBinError(strip+1, fitFunc.GetParError(1));
-    
-    gDirectory->cd(GetStripPath(det,ring,sec,strip, kTRUE));
-    grChannel->SetName(Form("FMD%d%c[%02d,%03d]",det,ring,sec,strip));
-    // grChannel->SetDirectory(gDirectory);
-    grChannel->Write();
-    // grChannel->Write(Form("grFMD%d%c_%d_%d",det,ring,sec,strip));
   }  
 }
 
 //_____________________________________________________________________
 void AliFMDGainDA::Terminate(TFile* diagFile)
 {
-  diagFile->cd();
-  fSummaryGains.Write();
+  // End of file 
+  // 
+  // Parameters: 
+  //   None
+  if(diagFile) {
+    diagFile->cd();
+    fSummaryGains.Write();
+  }
 }
 
 //_____________________________________________________________________
 void AliFMDGainDA::WriteHeaderToFile() 
 {
+  // Write header to the output file
+  // 
+  // Parameters: 
+  //   None
   AliFMDParameters* pars       = AliFMDParameters::Instance();
   fOutputFile.write(Form("# %s \n",pars->GetGainShuttleID()),9);
+  TDatime now;
+  fOutputFile << "# This file created from run # " << fRunno 
+             << " @ " << now.AsString() << std::endl;
   fOutputFile.write("# Detector, "
                    "Ring, "
                    "Sector, "
                    "Strip, "
                    "Gain, "
                    "Error, "
-                   "Chi2/NDF \n",56);
-  
+                   "Chi2/NDF \n",56);  
 }
 
 //_____________________________________________________________________
 TH1S* AliFMDGainDA::GetChannelHistogram(UShort_t det, 
                                        Char_t   ring, 
                                        UShort_t sec, 
-                                       UShort_t strip
+                                       UShort_t va
 {
-  
-  UShort_t  Ring = 1;
-  if(ring == 'O')
-    Ring = 0;
-  
-  
-  TObjArray* detArray  = static_cast<TObjArray*>(fGainArray.At(det));
-  TObjArray* ringArray = static_cast<TObjArray*>(detArray->At(Ring));
-  TObjArray* secArray  = static_cast<TObjArray*>(ringArray->At(sec));
-  TH1S* hChannel       = static_cast<TH1S*>(secArray->At(strip));
+  // Get the current histogram of a single strip
+  // 
+  // Parameters: 
+  //  det            Detector number
+  //  ring           Ring identifier 
+  //  sec            Sector number
+  //  va             VA number
+  TObjArray* secArray  = GetSectorArray(det, ring, sec);
+  Int_t      n         = secArray->GetEntriesFast();
+  TObjArray* cache     = static_cast<TObjArray*>(secArray->At(n-1));
+  TH1S* hChannel       = static_cast<TH1S*>(cache->At(va));
   
   return hChannel;
 }
@@ -290,36 +420,57 @@ TGraphErrors* AliFMDGainDA::GetChannel(UShort_t det,
                                       UShort_t sec, 
                                       UShort_t 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));
-  TGraphErrors* hChannel  = static_cast<TGraphErrors*>(secArray->At(strip));
+  // Get the graph of a single strip
+  // 
+  // Parameters: 
+  //  det            Detector number
+  //  ring           Ring identifier 
+  //  sec            Sector number
+  //  strip          Strip number
+  TObjArray*    stripArray = GetStripArray(det, ring, sec, strip);
+  TGraphErrors* hChannel   = static_cast<TGraphErrors*>(stripArray->At(0));
   
   return hChannel;
 }
 
+//_____________________________________________________________________
+TH1F* AliFMDGainDA::GetSectorSummary(UShort_t det, 
+                                    Char_t   ring, 
+                                    UShort_t sec) 
+{
+  TObjArray* secArray    = GetSectorArray(det, ring, sec);
+  Int_t      n           = secArray->GetEntriesFast();
+  return static_cast<TH1F*>(secArray->At(n-2)); // Cache added later
+}
+
 //_____________________________________________________________________
 void AliFMDGainDA::UpdatePulseAndADC(UShort_t det, 
                                     Char_t ring, 
                                     UShort_t sec, 
                                     UShort_t strip) 
 {
+  // Go to next pulse size
+  // 
+  // Parameters: 
+  //  det            Detector number
+  //  ring           Ring identifier 
+  //  sec            Sector number
+  //  strip          Strip number
   
-  AliFMDParameters* pars = AliFMDParameters::Instance();
-  // UInt_t ddl, board,chip,ch;
-  UShort_t board = pars->GetAltroMap()->Sector2Board(ring, sec);
-  // pars->Detector2Hardware(det,ring,sec,strip,ddl,board,chip,ch);
-  /// pars->GetAltroMap()->Strip2Channel(
-  Int_t halfring = GetHalfringIndex(det,ring,board/16);
+  AliFMDParameters* pars     = AliFMDParameters::Instance();
+  UShort_t          board    = pars->GetAltroMap()->Sector2Board(ring, sec);
+  Int_t             halfring = GetHalfringIndex(det,ring,board/16);
   
   if(GetCurrentEvent()> (fNumberOfStripsPerChip*fEventsPerChannel.At(halfring)))
     return;
-  if(strip % fNumberOfStripsPerChip) return;
+  
+  if ((sec       % 2) && ((strip+1) % fNumberOfStripsPerChip)) return;
+  if (((sec + 1) % 2) && (strip     % fNumberOfStripsPerChip)) return;
+  
   if(((GetCurrentEvent()) % fPulseLength.At(halfring)) 
      && GetCurrentEvent() > 0) return;
      
-  Int_t vaChip = strip/fNumberOfStripsPerChip; 
+  Int_t vaChip   = strip/fNumberOfStripsPerChip; 
   TH1S* hChannel = GetChannelHistogram(det,ring,sec,vaChip);
   
   if(!hChannel->GetEntries()) {
@@ -340,20 +491,25 @@ void AliFMDGainDA::UpdatePulseAndADC(UShort_t det,
   
   hChannel->GetXaxis()->SetRange(firstBin,lastBin);
   
-  Int_t channelNumber = (strip + 
-                        (GetCurrentEvent()-1)
-                        / ((fPulseLength.At(halfring)*fHighPulse)
-                           / fPulseSize.At(halfring))); 
-  
-  TGraphErrors* channel = GetChannel(det,ring,sec,channelNumber);
-  
+  Int_t         channelOff = ((GetCurrentEvent()-1)
+                             / ((fPulseLength.At(halfring)*fHighPulse)
+                                / fPulseSize.At(halfring)));
+  Int_t         channelNo  = (strip + ((sec % 2 == 1) ? -1 : 1) * channelOff);
+  TGraphErrors* channel    = GetChannel(det,ring,sec,channelNo);
+
   channel->SetPoint(fCurrentPulse.At(halfring),pulse,mean);
   channel->SetPointError(fCurrentPulse.At(halfring),0,rms);
   
   if(fSaveHistograms) {
-    gDirectory->cd(GetStripPath(det,ring,sec,channelNumber));
-    hChannel->Write(Form("%s_pulse_%03d",hChannel->GetName(),(Int_t)pulse));
-    
+    TH1S* out = 
+      static_cast<TH1S*>(hChannel->Clone(Form("FMD%d%c[%02d,%03d]_0x%02x",
+                                             det, ring, sec, channelNo, 
+                                             int(pulse))));
+    out->SetTitle(Form("FMD%d%c[%02d,%03d] DAC=0x%02x (%3d)",
+                      det, ring, sec, channelNo, int(pulse), int(pulse)));
+    out->SetDirectory(0);
+    TObjArray* arr = GetStripArray(det, ring, sec, channelNo);
+    arr->AddAtAndExpand(out, fCurrentPulse.At(halfring)+1);
   }
     
   hChannel->Reset();
@@ -363,12 +519,20 @@ void AliFMDGainDA::UpdatePulseAndADC(UShort_t det,
 //_____________________________________________________________________
 void AliFMDGainDA::ResetPulseAndUpdateChannel() 
 {  
+  // Reset all
+  // 
+  // Parameters: 
+  //   None
   fCurrentPulse.Reset(0); 
 }
 
 //_____________________________________________________________________
 void AliFMDGainDA::FinishEvent() 
 {
+  // End of event
+  // 
+  // Parameters: 
+  //   None
   for(UShort_t det=1; det<=3;det++) {
     UShort_t firstring = (det == 1 ? 1 : 0);
     for(UShort_t iring = firstring; iring <=1;iring++) {
@@ -376,12 +540,14 @@ void AliFMDGainDA::FinishEvent()
       for(UShort_t board =0 ; board <=1; board++) {
        Int_t idx = GetHalfringIndex(det,ring,board);
        
-       if( !fPulseLength.At(idx) || !fEventsPerChannel.At(idx))
+       if(!fPulseLength.At(idx) || !fEventsPerChannel.At(idx))
          continue;
-       if(GetCurrentEvent()>0 && ((GetCurrentEvent() % fPulseLength.At(idx)) == 0))
+       if(GetCurrentEvent()>0 && 
+          ((GetCurrentEvent() % fPulseLength.At(idx)) == 0))
          fCurrentPulse.AddAt(fCurrentPulse.At(idx)+1,idx);
        
-       if(GetCurrentEvent()>0 && ((GetCurrentEvent()) % fEventsPerChannel.At(idx)) == 0)
+       if(GetCurrentEvent()>0 && 
+          ((GetCurrentEvent()) % fEventsPerChannel.At(idx)) == 0)
          fCurrentPulse.AddAt(0,idx);
       }
     }