Work around when AliFMDCalibZeroSuppression contains
authorcholm <cholm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Sep 2011 14:40:18 +0000 (14:40 +0000)
committercholm <cholm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Sep 2011 14:40:18 +0000 (14:40 +0000)
a null array of data (as it is for all OCDB entries
in 2010 and 2011).  Problem most likely to be found
in Preprocessor.  The fix is however valid in all cases,
as the content is really only used for MC productions,
and since we always use the same setting on-line.  This
should be ported to the release ASAP.

FMD/AliFMDBoolMap.h
FMD/AliFMDCalibPedestal.h
FMD/AliFMDCalibSampleRate.h
FMD/AliFMDCalibStripRange.h
FMD/AliFMDEdepMap.h
FMD/AliFMDParameters.cxx
FMD/AliFMDParameters.h
FMD/AliFMDUShortMap.h
FMD/scripts/CheckCalibData.C [new file with mode: 0644]

index c2ebada..aee4000 100644 (file)
@@ -76,6 +76,7 @@ public:
                                   UShort_t str) const;
   Bool_t* Data() const { return fData; }
   Int_t   Total() const { return fTotal; }
+  void*   Ptr() const { return reinterpret_cast<void*>(fData); }
 protected:
   Int_t     MaxIndex()            const { return fTotal; }
   Bool_t    AtAsBool(Int_t idx)   const { return fData[idx]; }
index e6ae6cf..fdfe290 100644 (file)
@@ -104,6 +104,9 @@ public:
    * @return A pointer to possibly newly allocated dead map. 
    */
   AliFMDBoolMap* MakeDeadMap(Float_t maxW, AliFMDBoolMap* dead=0) const;
+
+  const AliFMDFloatMap& Values() const { return fValue; }
+  const AliFMDFloatMap& Widths() const { return fWidth; }
 private:
   AliFMDFloatMap fValue; /** Pedestal */
   AliFMDFloatMap fWidth; /** Pedestal width */
index e2179a8..3078495 100644 (file)
@@ -87,6 +87,8 @@ public:
    * @param inFile input file stream
    */
   void ReadFromFile(std::istream & inFile);
+
+  const AliFMDUShortMap& Rates() const { return fRates; }
 protected:
   // TArrayI fRates; // Sample rates 
   AliFMDUShortMap fRates; // Sample rates
index b9fc7c4..9b32642 100644 (file)
@@ -80,6 +80,7 @@ public:
    */
   void ReadFromFile(std::istream &);
   
+  const AliFMDUShortMap& Ranges() const { return fRanges; }
 protected:
   // TArrayI fRates; // Sample rates 
   AliFMDUShortMap fRanges; // Min max 
index 0bab877..7b88ae0 100644 (file)
@@ -76,6 +76,7 @@ public:
                                              Char_t   ring, 
                                              UShort_t sector, 
                                              UShort_t strip) const;
+  void*     Ptr() const { return reinterpret_cast<void*>(fData); }
 protected:
   Int_t     MaxIndex()            const { return fTotal; }
   Int_t     AtAsInt(Int_t idx)    const { return fData[idx].fN; }
index 78b6a5e..ac1e74d 100644 (file)
@@ -89,17 +89,17 @@ AliFMDParameters::AliFMDParameters()
     fAltroChannelSize(0),
     fChannelsPerAltro(0),
     fPedestalFactor(0),
-    fZSPre(0),
-    fZSPost(0),
-    fZSPedSubtract(kFALSE),
-    fFixedPedestal(0),
-    fFixedPedestalWidth(0),
-    fFixedZeroSuppression(0),
-    fFixedSampleRate(0),
+    fZSPre(1),
+    fZSPost(1),
+    fZSPedSubtract(kTRUE),
+    fFixedPedestal(100),
+    fFixedPedestalWidth(2),
+    fFixedZeroSuppression(1),
+    fFixedSampleRate(2),
     fFixedThreshold(0),
     fFixedMinStrip(0),
-    fFixedMaxStrip(0),
-    fFixedPulseGain(0), 
+    fFixedMaxStrip(127),
+    fFixedPulseGain(2), 
     fEdepMip(0),
     fHasCompleteHeader(kTRUE),
     fZeroSuppression(0), 
@@ -123,6 +123,7 @@ AliFMDParameters::AliFMDParameters()
   SetPedestalFactor();
   SetThreshold();
   SetStripRange();
+  SetGain();
   fAltroMap = new AliFMDAltroMapping;
 }
 
@@ -657,6 +658,12 @@ AliFMDParameters::GetEntry(const char* path, AliFMDPreprocessor* pp,
                               __LINE__);
     return 0;
   }
+  if (entry && AliLog::GetDebugLevel("FMD", "") > 0) { 
+    AliInfoF("Got entry %p for %s", entry, path);
+    entry->PrintId();
+    entry->PrintMetaData();                    
+    entry->Print();
+  }
   return entry;
 }
 
@@ -677,6 +684,8 @@ AliFMDParameters::InitPulseGain(AliFMDPreprocessor* pp)
   AliFMDDebug(5, ("Got gain from CDB"));
   fPulseGain = dynamic_cast<AliFMDCalibGain*>(gain->GetObject());
   if (!fPulseGain) AliFatal("Invalid pulser gain object from CDB");
+  if (!fPulseGain->Values().Ptr()) 
+    AliFatal("Empty pulser gain object from CDB");
 }
 //__________________________________________________________________
 void
@@ -694,6 +703,7 @@ AliFMDParameters::InitPedestal(AliFMDPreprocessor* pp)
   AliFMDDebug(5, ("Got pedestal from CDB"));
   fPedestal = dynamic_cast<AliFMDCalibPedestal*>(pedestal->GetObject());
   if (!fPedestal) AliFatal("Invalid pedestal object from CDB");
+  if (!fPedestal->Values().Ptr()) AliFatal("Empty pedestal object from CDB");
 }
 
 //__________________________________________________________________
@@ -712,6 +722,7 @@ AliFMDParameters::InitDeadMap(AliFMDPreprocessor* pp)
   AliFMDDebug(5, ("Got dead map from CDB"));
   fDeadMap = dynamic_cast<AliFMDCalibDeadMap*>(deadMap->GetObject());
   if (!fDeadMap) AliFatal("Invalid dead map object from CDB");
+  if (!fDeadMap->Ptr()) AliFatal("Empty dead map object from CDB");
 }
 
 //__________________________________________________________________
@@ -730,6 +741,12 @@ AliFMDParameters::InitZeroSuppression(AliFMDPreprocessor* pp)
   fZeroSuppression = 
     dynamic_cast<AliFMDCalibZeroSuppression*>(zeroSup->GetObject());
   if (!fZeroSuppression)AliFatal("Invalid zero suppression object from CDB");
+  if (!fZeroSuppression->Ptr()) {
+    AliWarningF("Empty zero suppression object from CDB, assuming %d",
+               fFixedZeroSuppression);
+    delete fZeroSuppression;
+    fZeroSuppression = 0;
+  }
 }
 
 //__________________________________________________________________
@@ -746,7 +763,9 @@ AliFMDParameters::InitSampleRate(AliFMDPreprocessor* pp)
   if (!sampRat) return;
   AliFMDDebug(5, ("Got zero suppression from CDB"));
   fSampleRate = dynamic_cast<AliFMDCalibSampleRate*>(sampRat->GetObject());
-  if (!fSampleRate) AliFatal("Invalid zero suppression object from CDB");
+  if (!fSampleRate) AliFatal("Invalid sample rate object from CDB");
+  if (!fSampleRate->Rates().Ptr()) 
+    AliFatal("empty sample rate object from CDB");
 }
 
 //__________________________________________________________________
@@ -789,6 +808,8 @@ AliFMDParameters::InitStripRange(AliFMDPreprocessor* pp)
   AliFMDDebug(5, ("Got strip range from CDB"));
   fStripRange = dynamic_cast<AliFMDCalibStripRange*>(range->GetObject());
   if (!fStripRange) AliFatal("Invalid strip range object from CDB");
+  if (!fStripRange->Ranges().Ptr()) 
+    AliFatal("Empty strip range object from CDB");
 }
 
 
@@ -886,6 +907,11 @@ AliFMDParameters::GetZeroSuppression(UShort_t detector, Char_t ring,
   //    zero suppression threshold (in ADC counts) 
   //
   if (!fZeroSuppression) return fFixedZeroSuppression;
+
+  // In case of empty zero suppression objects. 
+  if (!fZeroSuppression->Ptr() || 
+      fZeroSuppression->MaxIndex() <= 0) return fFixedZeroSuppression;
+
   // Need to map strip to ALTRO chip. 
   AliFMDDebug(50, ("zero sup. for FMD%d%c[%2d,%3d]=%d",
                    detector, ring, sector, strip,
index 91b1daa..e4993cf 100644 (file)
@@ -239,11 +239,11 @@ public:
   /** 
    * @param s Zero suppression threshold in ADC counts 
    */
-  void SetZeroSuppression(UShort_t s=0)       { fFixedZeroSuppression = s; }
+  void SetZeroSuppression(UShort_t s=1)       { fFixedZeroSuppression = s; }
   /** 
    * @param r How many times we oversample each strip. 
    */
-  void SetSampleRate(UShort_t r=1)            { fFixedSampleRate = r ;}//(r>2?2:r);}
+  void SetSampleRate(UShort_t r=2)            { fFixedSampleRate = r ;}//(r>2?2:r);}
   /** 
    * @param r How many times we oversample each strip. 
    */
@@ -251,7 +251,7 @@ public:
   /** 
    * @param p Pedestal value in ADC counts 
    */
-  void SetPedestal(Float_t p=10)              { fFixedPedestal = p; }
+  void SetPedestal(Float_t p=100)              { fFixedPedestal = p; }
   /** 
    * @param p Pedestal map 
    */
@@ -259,7 +259,7 @@ public:
   /** 
    * @param w Pedestal width in ADC counts 
    */
-  void SetPedestalWidth(Float_t w=1)          { fFixedPedestalWidth = w; }
+  void SetPedestalWidth(Float_t w=2)          { fFixedPedestalWidth = w; }
   /** 
    * @param t Threshold used for 1 MIP acceptance. 
    */
@@ -288,6 +288,10 @@ public:
    * @param g Gain map 
    */
   void SetGain(AliFMDCalibGain* g) { fPulseGain = g; }
+  /** 
+   * @param g Gain map 
+   */
+  void SetGain(Float_t g=2) { fFixedPulseGain = g; }
   /** @} */
 
   /** @{ */
index 48d4398..cd67642 100644 (file)
@@ -67,8 +67,21 @@ public:
                                     Char_t   ring, 
                                     UShort_t sector, 
                                     UShort_t strip) const;
- protected:
+  /** 
+   * Get the raw data pointer. 
+   * 
+   * @return Pointer to the data 
+   */
+  UShort_t* Data() const { return fData; }
+  /** 
+   * The total number of entries in the data array 
+   * 
+   * @return Total number of entries in the data array 
+   */
+  Int_t     Total() const { return fTotal; }
+  void*     Ptr() const { return reinterpret_cast<void*>(fData); }
   Int_t     MaxIndex()            const { return fTotal; }
+ protected:
   UShort_t  AtAsUShort(Int_t idx) const { return fData[idx]; }
   UShort_t& AtAsUShort(Int_t idx)       { return fData[idx]; }
   Int_t     AtAsInt(Int_t idx)    const { return fData[idx]; }
diff --git a/FMD/scripts/CheckCalibData.C b/FMD/scripts/CheckCalibData.C
new file mode 100644 (file)
index 0000000..2ce80c0
--- /dev/null
@@ -0,0 +1,121 @@
+#ifndef __CINT__
+#include <TSystemDirectory.h>
+#include <TFile.h>
+#include <TList.h>
+#include <AliCDBEntry.h>
+#include <AliFMDMap.h>
+#include <AliFMDCalibPedestal.h>
+#include <AliFMDCalibGain.h>
+#include <AliFMDCalibStripRange.h>
+#include <AliFMDCalibSampleRate.h>
+#include <TString.h>
+#include <TSystem.h>
+#include <TError.h>
+#else
+class AliFMDMap;
+#endif
+
+Bool_t 
+CheckMap(const char* path, const AliFMDMap* map)
+{
+  if (!map) { 
+    Warning("CheckFile", "No map in %s", path);
+    return false;
+  }
+  if (!map->Ptr() || map->MaxIndex() <= 0) { 
+    Warning("CheckFile", "Map %p (%d) has no data in %s", 
+           map->Ptr(), map->MaxIndex(), path);
+    return false;
+  }
+  return true;
+}
+
+enum {
+  kMap, 
+  kPedestal, 
+  kGain, 
+  kRate, 
+  kRange
+};
+  
+Bool_t
+CheckFile(const char* name, const char* dirName, Int_t which)
+{
+  TString path(gSystem->ConcatFileName(dirName, name));
+  TFile* file = TFile::Open(path, "READ");
+  if (!file) { 
+    Warning("CheckFile", "Failed to open %s", path.Data());
+    return false;
+  }
+  AliCDBEntry* entry = static_cast<AliCDBEntry*>(file->Get("AliCDBEntry"));
+  if (!entry) { 
+    Warning("CheckFile", "No entry in %s", path.Data());
+    file->Close();
+    return false;
+  }
+  TObject* object = entry->GetObject();
+  if (!object) { 
+    Warning("CheckFile", "Entry has no object in %s", path.Data());
+    file->Close();
+    return false;
+  }
+
+  const AliFMDMap* map = 0;
+  if (which == kMap) map = static_cast<AliFMDMap*>(object);
+  else if (which == kPedestal) 
+    map = &(static_cast<AliFMDCalibPedestal*>(object)->Values());
+  else if (which == kGain) 
+    map = &(static_cast<AliFMDCalibGain*>(object)->Values());
+  else if (which == kRate) 
+    map = &(static_cast<AliFMDCalibSampleRate*>(object)->Rates());
+  else if (which == kRange) 
+    map = &(static_cast<AliFMDCalibStripRange*>(object)->Ranges()); 
+  else {
+    Warning("CheckFile", "Don't now how to deal with what=%d", which);
+    file->Close();
+    return false;
+  }
+  if (!CheckMap(path.Data(), map)) { 
+    file->Close();
+    return false;
+  }
+  Info("CheckFile", "Map OK in %s", path.Data());
+  file->Close();
+  return true;
+}
+
+    
+void
+CheckCalibData(const char* dirName)
+{
+  TString dirS(dirName);
+  if (dirS.EndsWith("/")) dirS.Remove(dirS.Length()-1);
+  dirS = gSystem->BaseName(dirS.Data());
+  Int_t what = 0;
+  if (dirS == "Dead" || dirS == "ZeroSuppression") what = kMap;
+  else if (dirS == "Pedestal") what = kPedestal;
+  else if (dirS == "PulseGain") what = kGain;
+  else if (dirS == "SampleRate") what = kRate;
+  else if (dirS == "StripRange") what = kRange;
+  else {
+    Error("CheckCalibData", "Don't know how to deal with %s in %s", 
+         dirS.Data(), dirName);
+    return;
+  }
+    
+  TSystemDirectory dir(dirName, dirName);
+  TList* files(dir.GetListOfFiles());
+  TIter next(files);
+  TObject* obj = 0;
+  
+  Int_t nTotal = 0;
+  Int_t nOk    = 0;
+  while ((obj = next())) { 
+    TString name(obj->GetName());
+    if (!name.EndsWith(".root")) continue;
+    nTotal++;
+    if (CheckFile(name, dirName, what)) nOk++;
+  }
+  Info("CheckCalibData", "Total: %d, OK: %d, Bad: %d in %s ", 
+       nTotal, nOk, nTotal - nOk, dirName);
+}