Instead of crashing, allow some holes in the calibration data, and simply accounts...
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 9 Mar 2007 17:18:08 +0000 (17:18 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 9 Mar 2007 17:18:08 +0000 (17:18 +0000)
MUON/AliMUONPadStatusMaker.cxx
MUON/AliMUONPadStatusMaker.h

index 267738e..39720aa 100644 (file)
@@ -48,7 +48,7 @@
 #include "AliMpSlatSegmentation.h"
 #include "AliMpStationType.h"
 #include "AliMpVPadIterator.h"
-
+#include "AliMUON2DStoreValidator.h"
 #include "AliCDBManager.h"
 #include "AliCDBEntry.h"
 #include "AliDCSValue.h"
@@ -103,31 +103,22 @@ AliMUONPadStatusMaker::Combine(const AliMUONV2DStore& store1,
     Int_t detElemId = ip->GetFirst();
     Int_t manuId = ip->GetSecond();
     AliMUONVCalibParam* param1 = static_cast<AliMUONVCalibParam*>(store1.Get(detElemId,manuId));
-    if (!param1)
-    {
-      AliError(Form("Oups. Could not get statuses for store1 for DE %d ManuId %d !!!",
-                    detElemId,manuId));
-      delete combined;
-      combined = 0x0;
-      break;
-    }
     AliMUONVCalibParam* param2 = static_cast<AliMUONVCalibParam*>(store2.Get(detElemId,manuId));
     if (!param2)
     {
-      AliError(Form("Oups. Could not get statuses for store2 for DE %d ManuId %d",
+      AliWarning(Form("Could not get statuses for store2 for DE %d ManuId %d. Marking as missing.",
                     detElemId,manuId));
-      delete combined;
-      combined = 0x0;
-      break;
+      param2 = static_cast<AliMUONVCalibParam*>(param1->Clone());
+      for ( Int_t manuChannel = 0; manuChannel < param2->Size(); ++manuChannel )
+      {
+        param2->SetValueAsInt(manuChannel,0,kMissing);
+      }      
     }
     AliMUONVCalibParam* paramCombined = static_cast<AliMUONVCalibParam*>(combined->Get(detElemId,manuId));
     if (!paramCombined)
     {
-      AliError(Form("Oups. Could not get statuses for combined for DE %d ManuId %d",
-                    detElemId,manuId));
-      delete combined;
-      combined = 0x0;
-      break;
+      paramCombined = static_cast<AliMUONVCalibParam*>(param2->Clone());
+      combined->Set(detElemId,manuId,paramCombined,kFALSE);
     }
     
     for ( Int_t manuChannel = 0; manuChannel < param1->Size(); ++manuChannel )
@@ -153,6 +144,18 @@ AliMUONPadStatusMaker::Combine(const AliMUONV2DStore& store1,
 }
 
 //_____________________________________________________________________________
+AliMUONV2DStore* 
+AliMUONPadStatusMaker::GeneratePadStatus(Int_t value)
+{
+  /// Generate a "fake" store, with all (detElemId,manuId) present,
+  /// and containing all the same value
+  
+  AliMUONCalibParam1I param(64,value);
+  
+  return AliMUON2DMap::Generate(param);
+}
+
+//_____________________________________________________________________________
 Bool_t 
 AliMUONPadStatusMaker::GetSt12Status(const TMap& hvMap,
                                      Int_t detElemId, Int_t sector,
@@ -487,32 +490,57 @@ AliMUONPadStatusMaker::MakeStatus() const
   /// a combined status for each pad.
 
   TMap* hvValues = fCalibrationData.HV();
+  AliMUONV2DStore* hvStatus(0x0);
   
   if (!hvValues)
   {
-    AliError("Could not get HV values from CDB");
-    return 0x0;
+    AliError("Could not get HV values from CDB. Will create dummy ones and mark those as missing");
+    AliMUONCalibParam1I param(64,kHVMissing);
+    hvStatus = AliMUON2DMap::Generate(param);
+  }
+  else
+  {
+    hvStatus = MakeHVStatus(*hvValues);
   }
   
   AliMUONV2DStore* pedValues = fCalibrationData.Pedestals();
+  AliMUONV2DStore* pedStatus(0x0);
 
   if (!pedValues)
   {
-    AliError("Could not get pedestals values from CDB");
-    return 0x0;
-
+    AliError("Could not get pedestals values from CDB. Will create dummy ones and mark those as missing");
+    AliMUONCalibParam1I param(64,kPedMissing);
+    pedStatus = AliMUON2DMap::Generate(param);
+  }
+  else
+  {
+    pedStatus = MakePedestalStatus(*pedValues);
   }
   
-//  AliMUONV2DStore* gainValues = fCalibrationData.Gains();
-    
-  AliMUONV2DStore* hvStatus = MakeHVStatus(*hvValues);
-  AliMUONV2DStore* pedStatus = MakePedestalStatus(*pedValues);
+  // FIXME: should do the same for gains as for hv and ped.    
   
   AliMUONV2DStore* status = Combine(*hvStatus,*pedStatus,8);
   
   delete hvStatus;
   delete pedStatus;
   
+  // Insure we get all channels there (some or even all can be bad, but they
+  // must be there somehow).
+  
+  AliMUON2DStoreValidator validator;
+        
+  TObjArray* a = validator.Validate(*status);
+    
+  if (a) 
+  {
+    // this should not happen.
+    AliError("Status store not complete. Crash to follow soon...");
+    StdoutToAliError(a->Print(););
+    AliFatal("this should not happen at all!");
+    delete status;
+    status = 0x0;
+  }
+    
   return status;
 }
 
index 99087f7..6f60969 100644 (file)
@@ -35,8 +35,11 @@ public:
 
   AliMUONV2DStore* MakePedestalStatus(const AliMUONV2DStore& pedValues) const;
 
+  /// Produces a status store. Should not return 0x0.
   AliMUONV2DStore* MakeStatus() const;
 
+  static AliMUONV2DStore* GeneratePadStatus(Int_t value);
+
   TVector2 HVSt12Limits() const { return fHVSt12Limits; }
   TVector2 HVSt345Limits() const { return fHVSt345Limits; }
   
@@ -80,6 +83,11 @@ private:
   
 private:
   
+  enum EGeneralStatus
+  {
+    kMissing = (1<<7)
+  };
+  
   enum EPedestalStatus
   {
     kPedOK = 0,
@@ -87,7 +95,9 @@ private:
     kPedMeanTooLow = (1<<2),
     kPedMeanTooHigh = (1<<3),
     kPedSigmaTooLow = (1<<4),
-    kPedSigmaTooHigh = (1<<5)
+    kPedSigmaTooHigh = (1<<5),
+    
+    kPedMissing = kMissing // please always use last bit for meaning "missing"
   };
   
   enum EHVError 
@@ -97,8 +107,9 @@ private:
     kHVTooLow = (1<<1),
     kHVTooHigh = (1<<2),
     kHVChannelOFF = (1<<3),
-    kHVSwitchOFF = (1<<4)
-    
+    kHVSwitchOFF = (1<<4),
+
+    kHVMissing = kMissing // please always use last bit for meaning "missing"
   };
   
   const AliMUONCalibrationData& fCalibrationData; //!< helper class to get data access (not owner)