]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - FMD/AliFMDBaseDA.cxx
Adding calibration object for the sharing efficiency
[u/mrichter/AliRoot.git] / FMD / AliFMDBaseDA.cxx
index 43accc5511f67d190ea9b9e74e60b1c179bddd91..82debd4040703f2b38f6590dd09bab6f8a543d09 100644 (file)
     @brief   Base class for detector algorithms.
 */
 //
-//This is the implementation of the (virtual) base class for the FMD detector 
-//algorithms(DA). It implements the creation of the relevant containers and handles the 
-//loop over the raw data. The derived classes can control the parameters and action
-//to be taken making this the base class for the Pedestal, Gain and Physics DA.
+// This is the implementation of the (virtual) base class for the FMD
+// detector algorithms(DA). It implements the creation of the relevant
+// containers and handles the loop over the raw data. The derived
+// classes can control the parameters and action to be taken making
+// this the base class for the Pedestal, Gain and Physics DA.
 //
 
 #include "AliFMDBaseDA.h"
 #include "iostream"
-
 #include "AliFMDRawReader.h"
 #include "AliFMDCalibSampleRate.h"
+#include "AliFMDCalibStripRange.h"
 #include "AliLog.h"
+#include "AliRawEventHeaderBase.h"
+
 //_____________________________________________________________________
 ClassImp(AliFMDBaseDA)
+#if 0 
+; // Do not delete  - to let Emacs for mat the code
+#endif
+
+//_____________________________________________________________________
+const char*
+AliFMDBaseDA::GetStripPath(UShort_t det, 
+                          Char_t   ring, 
+                          UShort_t sec, 
+                          UShort_t str, 
+                          Bool_t   full) const
+{
+  return Form("%s%sFMD%d%c[%02d,%03d]", 
+             (full ? GetSectorPath(det, ring, sec, full) : ""), 
+             (full ? "/" : ""), det, ring, sec, str);
+}
+//_____________________________________________________________________
+const char*
+AliFMDBaseDA::GetSectorPath(UShort_t det, 
+                           Char_t   ring, 
+                           UShort_t sec, 
+                           Bool_t   full) const
+{
+  return Form("%s%sFMD%d%c[%02d]", 
+             (full ? GetRingPath(det, ring, full) : ""), 
+             (full ? "/" : ""), det, ring, sec);
+}
+//_____________________________________________________________________
+const char*
+AliFMDBaseDA::GetRingPath(UShort_t det, 
+                         Char_t   ring, 
+                         Bool_t   full) const
+{
+  return Form("%s%sFMD%d%c", 
+             (full ? GetDetectorPath(det, full) : ""), 
+             (full ? "/" : ""), det, ring);
+}
+//_____________________________________________________________________
+const char*
+AliFMDBaseDA::GetDetectorPath(UShort_t det, 
+                             Bool_t   full) const
+{
+  return Form("%s%sFMD%d", 
+             (full ? fDiagnosticsFilename.Data() : ""), 
+             (full ? ":/" : ""), det);
+}
 
 //_____________________________________________________________________
-AliFMDBaseDA::AliFMDBaseDA() : TNamed(),
+AliFMDBaseDA::AliFMDBaseDA() : 
+  TNamed(),
   fDiagnosticsFilename("diagnosticsHistograms.root"),
   fOutputFile(),
   fConditionsFile(),
   fSaveHistograms(kFALSE),
   fDetectorArray(),
+  fPulseSize(10),
+  fPulseLength(10),
   fRequiredEvents(0),
   fCurrentEvent(0)
-{
+ {
+   fSeenDetectors[0] = fSeenDetectors[1] = fSeenDetectors[2] = kFALSE;
   fDetectorArray.SetOwner();
   fConditionsFile.open("conditions.csv");
 }
 //_____________________________________________________________________
 AliFMDBaseDA::AliFMDBaseDA(const AliFMDBaseDA & baseDA) : 
   TNamed(baseDA),
-  fDiagnosticsFilename(baseDA.fDiagnosticsFilename),
+  fDiagnosticsFilename(baseDA.fDiagnosticsFilename.Data()),
   fOutputFile(),
   fConditionsFile(),
   fSaveHistograms(baseDA.fSaveHistograms),
   fDetectorArray(baseDA.fDetectorArray),
+  fPulseSize(baseDA.fPulseSize),
+  fPulseLength(baseDA.fPulseLength),
   fRequiredEvents(baseDA.fRequiredEvents),
   fCurrentEvent(baseDA.fCurrentEvent)
 {
+  fSeenDetectors[0] = baseDA.fSeenDetectors[0];
+  fSeenDetectors[1] = baseDA.fSeenDetectors[1];
+  fSeenDetectors[2] = baseDA.fSeenDetectors[2];
+
   fDetectorArray.SetOwner();
   
 }
 
 
 //_____________________________________________________________________
-AliFMDBaseDA::~AliFMDBaseDA() {
-
+AliFMDBaseDA::~AliFMDBaseDA() 
+{
   //destructor
-  
 }
 
 //_____________________________________________________________________
-void AliFMDBaseDA::Run(AliRawReader* reader) {
+void AliFMDBaseDA::Run(AliRawReader* reader) 
+{
+  TFile* diagFile = 0;
+  if (fSaveHistograms)
+    diagFile = TFile::Open(fDiagnosticsFilename.Data(),"RECREATE");
+
+  
   
   
   
-  InitContainer();
-
-  Init();
-
-  TFile* diagFile = 0;
-  if(fSaveHistograms)
-    {
-      diagFile = TFile::Open(fDiagnosticsFilename,"RECREATE");
-      for(UShort_t det=1;det<=3;det++) {
-       UShort_t FirstRing = (det == 1 ? 1 : 0);
-       
-       for (UShort_t ir = FirstRing; ir < 2; ir++) {
-         Char_t   ring = (ir == 0 ? 'O' : 'I');
-         UShort_t nsec = (ir == 0 ? 40  : 20);
-         UShort_t nstr = (ir == 0 ? 256 : 512);
-         
-         gDirectory->cd(Form("%s:/",fDiagnosticsFilename));
-         gDirectory->mkdir(Form("FMD%d%c",det,ring),Form("FMD%d%c",det,ring));
-         for(UShort_t sec =0; sec < nsec;  sec++)  {
-           gDirectory->cd(Form("%s:/FMD%d%c",fDiagnosticsFilename,det,ring));
-           gDirectory->mkdir(Form("sector_%d",sec));
-           for(UShort_t strip = 0; strip < nstr; strip++) {
-             gDirectory->cd(Form("%s:/FMD%d%c/sector_%d",fDiagnosticsFilename,det,ring,sec));
-             gDirectory->mkdir(Form("strip_%d",strip));
-             
-            }
-         }
-       }
-      }
-      
-    }
-    
   reader->Reset();
   
+  AliFMDRawReader* fmdReader  = new AliFMDRawReader(reader,0);
+  TClonesArray*    digitArray = new TClonesArray("AliFMDDigit",0);
   
+  Bool_t SOD_read = kFALSE;
   
-  AliFMDRawReader* fmdReader = new AliFMDRawReader(reader,0);
-  TClonesArray* digitArray   = new TClonesArray("AliFMDDigit",0);
+  for(Int_t i=0;i<3;i++) {
+    reader->NextEvent(); // Read Start-of-Run / Start-of-Files event
+    
+    UInt_t eventType = reader->GetType();
+    if(eventType == AliRawEventHeaderBase::kStartOfData || 
+       eventType == AliRawEventHeaderBase::kFormatError) { 
+      
+      WriteConditionsData(fmdReader);
+      Init();
+      SOD_read = kTRUE;
+      break;
+    }
+  }
   
-  WriteConditionsData();
+  InitContainer(diagFile);
+  
+  if(!SOD_read) 
+    AliWarning("No SOD event detected!");
   
-  reader->NextEvent();
-  reader->NextEvent();
   int lastProgress = 0;
   
-  for(Int_t n =1;n <= GetRequiredEvents(); n++)
-    {
-      if(!reader->NextEvent()) 
-       continue;
-      
-      SetCurrentEvent(*(reader->GetEventId()));
-      
-      digitArray->Clear();
-      fmdReader->ReadAdcs(digitArray);
-      
-      
-      //std::cout<<"In event # "<< *(reader->GetEventId()) << " with " <<digitArray->GetEntries()<<" digits     \r"<<std::flush;
-      
-      
-      for(Int_t i = 0; i<digitArray->GetEntries();i++) {
-       AliFMDDigit* digit = static_cast<AliFMDDigit*>(digitArray->At(i));
-       FillChannels(digit);
-      }
-      
-      FinishEvent();
-      int progress = int((n *100)/ GetRequiredEvents()) ;
-      if (progress <= lastProgress) continue;
-      lastProgress = progress;
-      std::cout << "Progress: " << lastProgress << " / 100 " << std::endl;
-      
-
-      
+  
+  
+  for(Int_t n =1;n <= GetRequiredEvents(); n++) {
+    if(!reader->NextEvent()) continue;
+    SetCurrentEvent(n);
+    digitArray->Clear();
+    fmdReader->ReadAdcs(digitArray);
+    
+    for(Int_t i = 0; i<digitArray->GetEntriesFast();i++) {
+      AliFMDDigit* digit = static_cast<AliFMDDigit*>(digitArray->At(i));
+      fSeenDetectors[digit->Detector()-1] = kTRUE;
+      FillChannels(digit);
     }
+    
+   
+    FinishEvent();
+    
+    int progress = int((n *100)/ GetRequiredEvents()) ;
+    if (progress <= lastProgress) continue;
+    lastProgress = progress;
+    std::cout << "Progress: " << lastProgress << " / 100 " << std::endl;
+    
+  }
+  
   AliInfo(Form("Looped over %d events",GetCurrentEvent()));
   WriteHeaderToFile();
   
   for(UShort_t det=1;det<=3;det++) {
+    if (!fSeenDetectors[det-1]) continue;
+    std::cout << "FMD" << det << std::endl;
     UShort_t FirstRing = (det == 1 ? 1 : 0);
     for (UShort_t ir = FirstRing; ir < 2; ir++) {
       Char_t   ring = (ir == 0 ? 'O' : 'I');
       UShort_t nsec = (ir == 0 ? 40  : 20);
       UShort_t nstr = (ir == 0 ? 256 : 512);
+      std::cout << " Ring " << ring << ": " << std::flush;
       for(UShort_t sec =0; sec < nsec;  sec++)  {
        for(UShort_t strip = 0; strip < nstr; strip++) {
          Analyse(det,ring,sec,strip);
-         
        }
+       std::cout << '.' << std::flush;
       }
+      if(fSaveHistograms)
+       diagFile->Flush();
+      std::cout << "done" << std::endl;
     }
   }
-
+  
   if(fOutputFile.is_open()) {
-    
     fOutputFile.write("# EOF\n",6);
     fOutputFile.close();
-    
   }
   
+  Terminate(diagFile);
+    
   if(fSaveHistograms ) {
-    AliInfo("Closing diagnostics file...please wait");
+    
+    AliInfo("Closing diagnostics file - please wait ...");
+    // diagFile->Write();
     diagFile->Close();
+    AliInfo("done");
+    
   }
 }
 //_____________________________________________________________________
 
-void AliFMDBaseDA::InitContainer(){
-
+void AliFMDBaseDA::InitContainer(TDirectory* diagFile)
+{
   TObjArray* detArray;
   TObjArray* ringArray;
   TObjArray* sectorArray;
     
+  TDirectory* savDir   = gDirectory;
+
   for(UShort_t det=1;det<=3;det++) {
     detArray = new TObjArray();
     detArray->SetOwner();
     fDetectorArray.AddAtAndExpand(detArray,det);
+
+    TDirectory* detDir = 0;
+    if (diagFile) {
+      diagFile->cd();
+      detDir = diagFile->mkdir(GetDetectorPath(det, kFALSE));
+    }
+
     UShort_t FirstRing = (det == 1 ? 1 : 0);
     for (UShort_t ir = FirstRing; ir < 2; ir++) {
       Char_t   ring = (ir == 0 ? 'O' : 'I');
@@ -198,56 +260,122 @@ void AliFMDBaseDA::InitContainer(){
       ringArray = new TObjArray();
       ringArray->SetOwner();
       detArray->AddAtAndExpand(ringArray,ir);
+
+
+      TDirectory* ringDir = 0;
+      if (detDir) { 
+       detDir->cd();
+       ringDir = detDir->mkdir(GetRingPath(det,ring, kFALSE));
+      }
+      
+
       for(UShort_t sec =0; sec < nsec;  sec++)  {
        sectorArray = new TObjArray();
        sectorArray->SetOwner();
        ringArray->AddAtAndExpand(sectorArray,sec);
+
+
+       TDirectory* secDir = 0;
+       if (ringDir) { 
+         ringDir->cd();
+         secDir = ringDir->mkdir(GetSectorPath(det, ring, sec, kFALSE));
+       }
+       
        for(UShort_t strip = 0; strip < nstr; strip++) {
+         if (secDir) { 
+           secDir->cd();
+           secDir->mkdir(GetStripPath(det, ring, sec, strip, kFALSE));
+         }
          AddChannelContainer(sectorArray, det, ring, sec, strip);
        }
       }
     }
   }
+  savDir->cd();
 }
 
 //_____________________________________________________________________ 
-void AliFMDBaseDA::WriteConditionsData() {
-  
+void AliFMDBaseDA::WriteConditionsData(AliFMDRawReader* fmdReader) 
+{
   AliFMDParameters* pars       = AliFMDParameters::Instance();
   fConditionsFile.write(Form("# %s \n",pars->GetConditionsShuttleID()),14);
-  fConditionsFile.write("# Sample Rate, timebins \n",25);
   
-  UInt_t defSampleRate = 4;
-  UInt_t timebins   = 544;
   AliFMDCalibSampleRate* sampleRate = new AliFMDCalibSampleRate();
-  for(UShort_t det=1;det<=3;det++) {
-    UShort_t FirstRing = (det == 1 ? 1 : 0);
-    for (UShort_t ir = FirstRing; ir < 2; ir++) {
-      Char_t   ring = (ir == 0 ? 'O' : 'I');
-      UShort_t nsec = (ir == 0 ? 40  : 20);
-      UShort_t nstr = (ir == 0 ? 256 : 512);
-      for(UShort_t sec =0; sec < nsec;  sec++)  {
-       for(UShort_t strip = 0; strip < nstr; strip++) {
-         sampleRate->Set(det,ring,sec,strip,defSampleRate);
-       }
+  AliFMDCalibStripRange* stripRange = new AliFMDCalibStripRange();
+  
+  fmdReader->ReadSODevent(sampleRate,stripRange,fPulseSize,fPulseLength,
+                         fSeenDetectors);
+
+  sampleRate->WriteToFile(fConditionsFile, fSeenDetectors);
+  stripRange->WriteToFile(fConditionsFile, fSeenDetectors);
+
+  // Zero Suppresion
+  
+  // Strip Range
+  
+  fConditionsFile.write("# Gain Events \n",15);
+  
+  for(UShort_t det=1; det<=3;det++) {
+    if (!fSeenDetectors[det-1]) { 
+      continue;
+    }
+    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);
+       
+       fConditionsFile << det                     << ','
+                       << ring                    << ','
+                       << board                   << ','
+                       << fPulseLength.At(idx)    << "\n";
+       
       }
     }
   }
   
-  pars->SetSampleRate(sampleRate);
-  
-  
-  fConditionsFile     << defSampleRate   << ',' 
-                     << timebins     <<"\n";
+  fConditionsFile.write("# Gain Pulse \n",14);
   
+  for(UShort_t det=1; det<=3;det++) {
+    if (!fSeenDetectors[det-1]) { 
+      continue;
+    }
+    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);
+       
+       fConditionsFile << det                     << ','
+                       << ring                    << ','
+                       << board                   << ','
+                       << fPulseSize.At(idx)      << "\n";
+       
+      }
+    }
+  }
   if(fConditionsFile.is_open()) {
     
-    //  fConditionsFile.write("# EOF\n",6);
+    fConditionsFile.write("# EOF\n",6);
     fConditionsFile.close();
     
   }
   
 }
+//_____________________________________________________________________ 
+Int_t AliFMDBaseDA::GetHalfringIndex(UShort_t det, Char_t ring, UShort_t board) {
+
+  UShort_t iring  =  (ring == 'I' ? 1 : 0);
+  
+  Int_t index = (((det-1) << 2) | (iring << 1) | (board << 0));
+  
+  return index-2;
+  
+}
+
 
 //_____________________________________________________________________ 
 //