]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - FMD/AliFMDParameters.cxx
Changed call to TClonesArray::GetEntries() to TClonesArray::GetEntriesFast() for...
[u/mrichter/AliRoot.git] / FMD / AliFMDParameters.cxx
index e8133a40d9f4e1b7850e01f742e0671c7ca9ecc8..49d770b7067d9860537678f6b88631e4c4a4e5b1 100644 (file)
@@ -29,7 +29,7 @@
 // `Init'.  Optionally, the class can serve hard-coded constants, if
 // no CDB is available. 
 //                                                       
-#include "AliLog.h"               // ALILOG_H
+#include "AliFMDDebug.h"                  // ALILOG_H
 #include "AliFMDParameters.h"     // ALIFMDPARAMETERS_H
 #include "AliFMDGeometry.h"       // ALIFMDGEOMETRY_H
 #include "AliFMDRing.h"                   // ALIFMDRING_H
 #include "AliFMDAltroMapping.h"    // ALIFMDALTROMAPPING_H
 #include <AliCDBManager.h>         // ALICDBMANAGER_H
 #include <AliCDBEntry.h>           // ALICDBMANAGER_H
+#include <AliFMDPreprocessor.h>
+#include <AliLog.h>
 #include <Riostream.h>
 #include <sstream>
+#include <TSystem.h>
 #include <TArrayF.h>
 #include <TH2D.h>
 
@@ -55,14 +58,16 @@ ClassImp(AliFMDParameters)
 AliFMDParameters* AliFMDParameters::fgInstance = 0;
 
 //____________________________________________________________________
-const char* AliFMDParameters::fgkPulseGain      = "FMD/Calib/PulseGain";
-const char* AliFMDParameters::fgkPedestal       = "FMD/Calib/Pedestal";
-const char* AliFMDParameters::fgkDead           = "FMD/Calib/Dead";
-const char* AliFMDParameters::fgkSampleRate     = "FMD/Calib/SampleRate";
-const char* AliFMDParameters::fgkAltroMap       = "FMD/Calib/AltroMap";
-const char* AliFMDParameters::fgkZeroSuppression = "FMD/Calib/ZeroSuppression";
-const char* AliFMDParameters::fgkStripRange     = "FMD/Calib/StripRange";
-
+const char* AliFMDParameters::fgkPulseGain         = "FMD/Calib/PulseGain";
+const char* AliFMDParameters::fgkPedestal          = "FMD/Calib/Pedestal";
+const char* AliFMDParameters::fgkDead              = "FMD/Calib/Dead";
+const char* AliFMDParameters::fgkSampleRate        = "FMD/Calib/SampleRate";
+const char* AliFMDParameters::fgkAltroMap          = "FMD/Calib/AltroMap";
+const char* AliFMDParameters::fgkZeroSuppression    = "FMD/Calib/ZeroSuppression";
+const char* AliFMDParameters::fgkStripRange        = "FMD/Calib/StripRange";
+const char* AliFMDParameters::fkPedestalShuttleID   = "pedestals";
+const char* AliFMDParameters::fkGainShuttleID       = "gains";
+const char* AliFMDParameters::fkConditionsShuttleID = "conditions";
 
 //____________________________________________________________________
 AliFMDParameters* 
@@ -90,6 +95,8 @@ AliFMDParameters::AliFMDParameters()
     fFixedMaxStrip(0),
     fFixedPulseGain(0), 
     fEdepMip(0),
+    fHasRcuTrailer(kTRUE),
+    fHasCompleteHeader(kTRUE),
     fZeroSuppression(0), 
     fSampleRate(0), 
     fPedestal(0), 
@@ -109,24 +116,40 @@ AliFMDParameters::AliFMDParameters()
   SetPedestalFactor();
   SetThreshold();
   SetStripRange();
+  fAltroMap = new AliFMDAltroMapping;
 }
 
 //__________________________________________________________________
 void
-AliFMDParameters::Init(Bool_t forceReInit)
+AliFMDParameters::Init(Bool_t forceReInit, UInt_t what)
 {
   // Initialize the parameters manager.  We need to get stuff from the
   // CDB here. 
   if (forceReInit) fIsInit = kFALSE;
   if (fIsInit) return;
-  InitPulseGain();
-  InitPedestal();
-  InitDeadMap();
-  InitSampleRate();
-  InitZeroSuppression();
-  InitAltroMap();
+  if (what & kPulseGain)       InitPulseGain();
+  if (what & kPedestal)        InitPedestal();
+  if (what & kDeadMap)         InitDeadMap();
+  if (what & kSampleRate)      InitSampleRate();
+  if (what & kZeroSuppression) InitZeroSuppression();
+  if (what & kAltroMap)        InitAltroMap();
+  fIsInit = kTRUE;
+}
+//__________________________________________________________________
+void
+AliFMDParameters::Init(AliFMDPreprocessor* pp, Bool_t forceReInit, UInt_t what)
+{
+  // Initialize the parameters manager.  We need to get stuff from the
+  // CDB here. 
+  if (forceReInit) fIsInit = kFALSE;
+  if (fIsInit) return;
+  if (what & kPulseGain)       InitPulseGain(pp);
+  if (what & kPedestal)        InitPedestal(pp);
+  if (what & kDeadMap)         InitDeadMap(pp);
+  if (what & kSampleRate)      InitSampleRate(pp);
+  if (what & kZeroSuppression) InitZeroSuppression(pp);
+  if (what & kAltroMap)        InitAltroMap(pp);
   fIsInit = kTRUE;
-  
 }
 
 //__________________________________________________________________
@@ -288,24 +311,24 @@ AliFMDParameters::Print(Option_t* option) const
     size_t   i    = opt.Index("fmd",TString::kIgnoreCase);
     size_t   j    = opt.Index("]",TString::kIgnoreCase);
     enum {
-      read_det, 
-      read_ring, 
-      read_lbrack,
-      read_sector,
-      read_comma,
-      read_strip,
-      read_rbrack, 
-      end
-    } state = read_det;
+      kReadDet, 
+      kReadRing, 
+      kReadLbrack,
+      kReadSector,
+      kReadComma,
+      kReadStrip,
+      kReadRbrack, 
+      kEnd
+    } state = kReadDet;
     std::stringstream s(opt(i+4, j-i-3).Data());
-    while (state != end) {
+    while (state != kEnd) {
       Char_t tmp = s.peek();
       if (tmp == ' ' || tmp == '\t') {
        s.get();
        continue;
       }
       switch (state) {
-      case read_det: { // First, try to read the detector 
+      case kReadDet: { // First, try to kRead the detector 
        if (tmp == '*') s.get();
        else { 
          UShort_t det;
@@ -315,23 +338,23 @@ AliFMDParameters::Print(Option_t* option) const
            ds[1] = 0;
          }
        }
-       state = (s.bad() ? end : read_ring);
+       state = (s.bad() ? kEnd : kReadRing);
       } break;
-      case read_ring: { // Then try to read the ring;
+      case kReadRing: { // Then try to read the ring;
        Char_t ring;
        s >> ring;
        if (ring != '*' && !s.bad()) {
          rs[0] = ring;
          rs[1] = '\0';
        }
-       state = (s.bad() ? end : read_lbrack);
+       state = (s.bad() ? kEnd : kReadLbrack);
       } break;
-      case read_lbrack: { // Try to read a left bracket 
+      case kReadLbrack: { // Try to read a left bracket 
        Char_t lbrack;
        s >> lbrack;
-       state = (s.bad() ? end : read_sector);
+       state = (s.bad() ? kEnd : kReadSector);
       } break;
-      case read_sector: { // Try to read a sector 
+      case kReadSector: { // Try to read a sector 
        if (tmp == '*') s.get();
        else {
          UShort_t sec;
@@ -341,14 +364,14 @@ AliFMDParameters::Print(Option_t* option) const
            maxSector = sec + 1;
          }
        }
-       state = (s.bad() ? end : read_comma);
+       state = (s.bad() ? kEnd : kReadComma);
       } break;
-      case read_comma: { // Try to read a left bracket 
+      case kReadComma: { // Try to read a left bracket 
        Char_t comma;
        s >> comma;
-       state = (s.bad() ? end : read_strip);
+       state = (s.bad() ? kEnd : kReadStrip);
       } break;
-      case read_strip: { // Try to read a strip 
+      case kReadStrip: { // Try to read a strip 
        if (tmp == '*') s.get();
        else {
          UShort_t str;
@@ -358,14 +381,14 @@ AliFMDParameters::Print(Option_t* option) const
            maxStrip = str + 1;
          }
        }
-       state = (s.bad() ? end : read_rbrack);
+       state = (s.bad() ? kEnd : kReadRbrack);
       } break;
-      case read_rbrack: { // Try to read a left bracket 
+      case kReadRbrack: { // Try to read a left bracket 
        Char_t rbrack;
        s >> rbrack;
-       state = end;
+       state = kEnd;
       } break;
-      case end: 
+      case kEnd: 
        break;
       }
     }
@@ -434,128 +457,128 @@ AliFMDParameters::SetStripRange(UShort_t min, UShort_t max)
   fFixedMaxStrip = max;
 }
 
+//__________________________________________________________________
+AliCDBEntry*
+AliFMDParameters::GetEntry(const char* path, AliFMDPreprocessor* pp, 
+                          Bool_t fatal) const
+{
+  // Get an entry from the CDB or via preprocessor 
+  AliCDBEntry* entry = 0;
+  if (!pp) {
+    AliCDBManager* cdb = AliCDBManager::Instance();
+    entry              = cdb->Get(path);
+  }
+  else {
+    const char* third  = gSystem->BaseName(path);
+    const char* second = gSystem->BaseName(gSystem->DirName(path));
+    entry              = pp->GetFromCDB(second, third);
+  }
+  if (!entry) { 
+    TString msg(Form("No %s found in CDB, perhaps you need to "
+                    "use AliFMDCalibFaker?", path));
+    if (fatal) { AliFatal(msg.Data()); }
+    else       AliLog::Message(AliLog::kWarning, msg.Data(), "FMD", 
+                              "AliFMDParameters", "GetEntry", __FILE__, 
+                              __LINE__);
+    return 0;
+  }
+  return entry;
+}
+
+    
 //__________________________________________________________________
 void
-AliFMDParameters::InitPulseGain()
+AliFMDParameters::InitPulseGain(AliFMDPreprocessor* pp)
 {
   // Get pulse gain from CDB or used fixed 
-  AliCDBManager* cdb      = AliCDBManager::Instance();
-  AliCDBEntry*   gain     = cdb->Get(fgkPulseGain);
-  if (!gain) {
-    AliWarning(Form("No %s found in CDB, perhaps you need to "
-                   "use AliFMDCalibFaker?", fgkPulseGain));
-    return;
-  }
+  AliCDBEntry*   gain     = GetEntry(fgkPulseGain, pp);
+  if (!gain) return;
   
-  AliDebug(1, Form("Got gain from CDB"));
+  AliFMDDebug(1, ("Got gain from CDB"));
   fPulseGain = dynamic_cast<AliFMDCalibGain*>(gain->GetObject());
-  if (!fPulseGain) AliWarning("Invalid pulser gain object from CDB");
+  if (!fPulseGain) AliFatal("Invalid pulser gain object from CDB");
 }
 //__________________________________________________________________
 void
-AliFMDParameters::InitPedestal()
+AliFMDParameters::InitPedestal(AliFMDPreprocessor* pp)
 {
   // Initialize the pedestals from CDB 
-  AliCDBManager* cdb      = AliCDBManager::Instance();
-  AliCDBEntry*   pedestal = cdb->Get(fgkPedestal);
-  if (!pedestal) {
-    AliWarning(Form("No %s found in CDB, perhaps you need to "
-                   "use AliFMDCalibFaker?", fgkPedestal));
-    return;
-  }
-  AliDebug(1, Form("Got pedestal from CDB"));
+  AliCDBEntry*   pedestal = GetEntry(fgkPedestal, pp);
+  if (!pedestal) return;
+
+  AliFMDDebug(1, ("Got pedestal from CDB"));
   fPedestal = dynamic_cast<AliFMDCalibPedestal*>(pedestal->GetObject());
-  if (!fPedestal) AliWarning("Invalid pedestal object from CDB");
+  if (!fPedestal) AliFatal("Invalid pedestal object from CDB");
 }
 
 //__________________________________________________________________
 void
-AliFMDParameters::InitDeadMap()
+AliFMDParameters::InitDeadMap(AliFMDPreprocessor* pp)
 {
   // Get Dead-channel-map from CDB 
-  AliCDBManager* cdb      = AliCDBManager::Instance();
-  AliCDBEntry*   deadMap  = cdb->Get(fgkDead);
-  if (!deadMap) {
-    AliWarning(Form("No %s found in CDB, perhaps you need to "
-                   "use AliFMDCalibFaker?", fgkDead));
-    return;
-  }
-  AliDebug(1, Form("Got dead map from CDB"));
+  AliCDBEntry*   deadMap  = GetEntry(fgkDead, pp);
+  if (!deadMap) return;
+  
+  AliFMDDebug(1, ("Got dead map from CDB"));
   fDeadMap = dynamic_cast<AliFMDCalibDeadMap*>(deadMap->GetObject());
-  if (!fDeadMap) AliWarning("Invalid dead map object from CDB");
+  if (!fDeadMap) AliFatal("Invalid dead map object from CDB");
 }
 
 //__________________________________________________________________
 void
-AliFMDParameters::InitZeroSuppression()
+AliFMDParameters::InitZeroSuppression(AliFMDPreprocessor* pp)
 {
   // Get 0-suppression from CDB 
-  AliCDBManager* cdb      = AliCDBManager::Instance();
-  AliCDBEntry*   zeroSup  = cdb->Get(fgkZeroSuppression);
-  if (!zeroSup) {
-    AliWarning(Form("No %s found in CDB, perhaps you need to "
-                   "use AliFMDCalibFaker?", fgkZeroSuppression));
-    return;
-  }
-  AliDebug(1, Form("Got zero suppression from CDB"));
+  AliCDBEntry*   zeroSup  = GetEntry(fgkZeroSuppression, pp);
+  if (!zeroSup) return;
+  AliFMDDebug(1, ("Got zero suppression from CDB"));
   fZeroSuppression = 
     dynamic_cast<AliFMDCalibZeroSuppression*>(zeroSup->GetObject());
-  if (!fZeroSuppression)AliWarning("Invalid zero suppression object from CDB");
+  if (!fZeroSuppression)AliFatal("Invalid zero suppression object from CDB");
 }
 
 //__________________________________________________________________
 void
-AliFMDParameters::InitSampleRate()
+AliFMDParameters::InitSampleRate(AliFMDPreprocessor* pp)
 {
   // get Sample rate from CDB
-  AliCDBManager* cdb      = AliCDBManager::Instance();
-  AliCDBEntry*   sampRat  = cdb->Get(fgkSampleRate);
-  if (!sampRat) {
-    AliWarning(Form("No %s found in CDB, perhaps you need to "
-                   "use AliFMDCalibFaker?", fgkSampleRate));
-    return;
-  }
-  AliDebug(1, Form("Got zero suppression from CDB"));
+  AliCDBEntry*   sampRat  = GetEntry(fgkSampleRate, pp);
+  if (!sampRat) return;
+  AliFMDDebug(1, ("Got zero suppression from CDB"));
   fSampleRate = dynamic_cast<AliFMDCalibSampleRate*>(sampRat->GetObject());
-  if (!fSampleRate) AliWarning("Invalid zero suppression object from CDB");
+  if (!fSampleRate) AliFatal("Invalid zero suppression object from CDB");
 }
 
 //__________________________________________________________________
 void
-AliFMDParameters::InitAltroMap()
+AliFMDParameters::InitAltroMap(AliFMDPreprocessor* pp)
 {
   // Get hardware mapping from CDB
-  AliCDBManager* cdb      = AliCDBManager::Instance();
-  AliCDBEntry*   hwMap    = cdb->Get(fgkAltroMap);       
-  if (!hwMap) {
-    AliWarning(Form("No %s found in CDB, perhaps you need to "
-                   "use AliFMDCalibFaker?", fgkAltroMap));
-    fAltroMap = new AliFMDAltroMapping;
-    return;
+  if (fAltroMap) { 
+    delete fAltroMap;
+    fAltroMap = 0;
   }
-  AliDebug(1, Form("Got ALTRO map from CDB"));
+  AliCDBEntry*   hwMap    = GetEntry(fgkAltroMap, pp);       
+  if (!hwMap) return;
+
+  AliFMDDebug(1, ("Got ALTRO map from CDB"));
   fAltroMap = dynamic_cast<AliFMDAltroMapping*>(hwMap->GetObject());
   if (!fAltroMap) {
-    AliWarning("Invalid ALTRO map object from CDB");
+    AliFatal("Invalid ALTRO map object from CDB");
     fAltroMap = new AliFMDAltroMapping;
   }
 }
 
 //__________________________________________________________________
 void
-AliFMDParameters::InitStripRange()
+AliFMDParameters::InitStripRange(AliFMDPreprocessor* pp)
 {
   // Get strips read-out from CDB
-  AliCDBManager* cdb      = AliCDBManager::Instance();
-  AliCDBEntry*   range    = cdb->Get(fgkStripRange);
-  if (!range) {
-    AliWarning(Form("No %s found in CDB, perhaps you need to "
-                   "use AliFMDCalibFaker?", fgkStripRange));
-    return;
-  }
-  AliDebug(1, Form("Got strip range from CDB"));
+  AliCDBEntry*   range    = GetEntry(fgkStripRange, pp);
+  if (!range) return;
+  AliFMDDebug(1, ("Got strip range from CDB"));
   fStripRange = dynamic_cast<AliFMDCalibStripRange*>(range->GetObject());
-  if (!fStripRange) AliWarning("Invalid strip range object from CDB");
+  if (!fStripRange) AliFatal("Invalid strip range object from CDB");
 }
 
 
@@ -587,7 +610,7 @@ AliFMDParameters::GetPulseGain(UShort_t detector, Char_t ring,
       fFixedPulseGain = fVA1MipRange * GetEdepMip() / fAltroChannelSize;
     return fFixedPulseGain;
   }  
-  AliDebug(50, Form("pulse gain for FMD%d%c[%2d,%3d]=%f",
+  AliFMDDebug(50, ("pulse gain for FMD%d%c[%2d,%3d]=%f",
                    detector, ring, sector, strip,
                    fPulseGain->Value(detector, ring, sector, strip)));
   return fPulseGain->Value(detector, ring, sector, strip);
@@ -600,7 +623,7 @@ AliFMDParameters::IsDead(UShort_t detector, Char_t ring,
 {
   // Check if the channel is dead 
   if (!fDeadMap) return kFALSE;
-  AliDebug(50, Form("Dead for FMD%d%c[%2d,%3d]=%s",
+  AliFMDDebug(50, ("Dead for FMD%d%c[%2d,%3d]=%s",
                    detector, ring, sector, strip,
                    fDeadMap->operator()(detector, ring, sector, strip) ? 
                    "no" : "yes"));
@@ -615,7 +638,7 @@ AliFMDParameters::GetZeroSuppression(UShort_t detector, Char_t ring,
   // Get zero suppression threshold 
   if (!fZeroSuppression) return fFixedZeroSuppression;
   // Need to map strip to ALTRO chip. 
-  AliDebug(50, Form("zero sup. for FMD%d%c[%2d,%3d]=%f",
+  AliFMDDebug(50, ("zero sup. for FMD%d%c[%2d,%3d]=%f",
                    detector, ring, sector, strip,
                    fZeroSuppression->operator()(detector, ring, 
                                                 sector, strip)));
@@ -631,7 +654,7 @@ AliFMDParameters::GetSampleRate(UShort_t det, Char_t ring, UShort_t sector,
   if (!fSampleRate) return fFixedSampleRate;
   // Need to map sector to digitizier card. 
   UInt_t ret = fSampleRate->Rate(det, ring, sector, str);
-  AliDebug(50, Form("Sample rate for FMD%d%c[%2d,%3d]=%d", 
+  AliFMDDebug(50, ("Sample rate for FMD%d%c[%2d,%3d]=%d", 
                    det, ring, sector, str, ret));
   return ret;
 }
@@ -645,7 +668,7 @@ AliFMDParameters::GetMinStrip(UShort_t det, Char_t ring, UShort_t sector,
   if (!fStripRange) return fFixedMinStrip;
   // Need to map sector to digitizier card. 
   UInt_t ret = fStripRange->Min(det, ring, sector, str);
-  AliDebug(50, Form("Min strip # for FMD%d%c[%2d,%3d]=%d", 
+  AliFMDDebug(50, ("Min strip # for FMD%d%c[%2d,%3d]=%d", 
                    det, ring, sector, str, ret));
   return ret;
 }
@@ -659,7 +682,7 @@ AliFMDParameters::GetMaxStrip(UShort_t det, Char_t ring, UShort_t sector,
   if (!fStripRange) return fFixedMaxStrip;
   // Need to map sector to digitizier card. 
   UInt_t ret = fStripRange->Max(det, ring, sector, str);
-  AliDebug(50, Form("Max strip # for FMD%d%c[%2d,%3d]=%d", 
+  AliFMDDebug(50, ("Max strip # for FMD%d%c[%2d,%3d]=%d", 
                    det, ring, sector, str, ret));
   return ret;
 }
@@ -671,7 +694,7 @@ AliFMDParameters::GetPedestal(UShort_t detector, Char_t ring,
 {
   // Get the pedesal 
   if (!fPedestal) return fFixedPedestal;
-  AliDebug(50, Form("pedestal for FMD%d%c[%2d,%3d]=%f",
+  AliFMDDebug(50, ("pedestal for FMD%d%c[%2d,%3d]=%f",
                    detector, ring, sector, strip,
                    fPedestal->Value(detector, ring, sector, strip)));
   return fPedestal->Value(detector, ring, sector, strip);
@@ -684,7 +707,7 @@ AliFMDParameters::GetPedestalWidth(UShort_t detector, Char_t ring,
 {
   // Get the pedesal 
   if (!fPedestal) return fFixedPedestalWidth;
-  AliDebug(50, Form("pedetal width for FMD%d%c[%2d,%3d]=%f",
+  AliFMDDebug(50, ("pedetal width for FMD%d%c[%2d,%3d]=%f",
                    detector, ring, sector, strip,
                    fPedestal->Width(detector, ring, sector, strip)));
   return fPedestal->Width(detector, ring, sector, strip);
@@ -701,9 +724,20 @@ AliFMDParameters::GetAltroMap() const
 
 //__________________________________________________________________
 Bool_t
-AliFMDParameters::Hardware2Detector(UInt_t ddl, UInt_t addr, UShort_t& det,
-                                   Char_t& ring, UShort_t& sec, 
-                                   UShort_t& str) const
+AliFMDParameters::Hardware2Detector(UInt_t    ddl,  UInt_t    board, 
+                                   UInt_t    chip, UInt_t    chan,
+                                   UShort_t& det,  Char_t&   ring, 
+                                   UShort_t& sec,  UShort_t& str) const
+{
+  // Map hardware address to detector index
+  if (!fAltroMap) return kFALSE;
+  return fAltroMap->Hardware2Detector(ddl,board,chip,chan, det,ring,sec,str);
+}
+//__________________________________________________________________
+Bool_t
+AliFMDParameters::Hardware2Detector(UInt_t    ddl,  UInt_t    addr, 
+                                   UShort_t& det,  Char_t&   ring, 
+                                   UShort_t& sec,  UShort_t& str) const
 {
   // Map hardware address to detector index
   if (!fAltroMap) return kFALSE;
@@ -712,9 +746,21 @@ AliFMDParameters::Hardware2Detector(UInt_t ddl, UInt_t addr, UShort_t& det,
 
 //__________________________________________________________________
 Bool_t
-AliFMDParameters::Detector2Hardware(UShort_t det, Char_t ring, UShort_t sec, 
-                                   UShort_t str, UInt_t& ddl, 
-                                   UInt_t& addr) const                       
+AliFMDParameters::Detector2Hardware(UShort_t det,  Char_t   ring, 
+                                   UShort_t sec,  UShort_t str, 
+                                   UInt_t&  ddl,  UInt_t&  board, 
+                                   UInt_t&  chip, UInt_t&  chan) const
+{
+  // Map detector index to hardware address
+  if (!fAltroMap) return kFALSE;
+  return fAltroMap->Detector2Hardware(det,ring,sec,str, ddl,board,chip,chan);
+}
+
+//__________________________________________________________________
+Bool_t
+AliFMDParameters::Detector2Hardware(UShort_t det, Char_t   ring, 
+                                   UShort_t sec, UShort_t str, 
+                                   UInt_t&  ddl, UInt_t&  addr) const
 {
   // Map detector index to hardware address
   if (!fAltroMap) return kFALSE;