Updates to include list of active DDLs in AltroConfig OCDB entries
authorhaavard <haavard@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 22 Feb 2010 14:40:27 +0000 (14:40 +0000)
committerhaavard <haavard@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 22 Feb 2010 14:40:27 +0000 (14:40 +0000)
TPC/AliTPCPreprocessor.cxx
TPC/AliTPCPreprocessor.h
TPC/AliTPCcalibDB.cxx
TPC/AliTPCcalibDB.h
TPC/AliTPCmapper.h

index 8e8df56..7bf514e 100644 (file)
@@ -47,6 +47,9 @@ const TString kCosmicRunType = "COSMIC";     // cosmic run identifier
 const TString kLaserRunType = "LASER";       // laser run identifier
 const TString kDaqRunType = "DAQ"; // DAQ run identifier
 const TString kAmandaTemp = "TPC_PT_%d_TEMPERATURE"; // Amanda string for temperature entries
+const TString kAmandaDDL = "DDL%d";   // Amanda string for list of active DDLs
+const Int_t  kNumDDL = 216;           // number of TPC DDLs
+const Int_t  kFirstDDL = 768;         // identifier of first DDL
 //const Double_t kFitFraction = 0.7;                 // Fraction of DCS sensor fits required              
 const Double_t kFitFraction = -1.0;          // Don't require minimum number of fits in commissioning run 
 const Int_t   kNumPressureSensors = 3;    // number of pressure sensors
@@ -399,7 +402,7 @@ UInt_t AliTPCPreprocessor::Process(TMap* dcsAliasMap)
   TString altroConf = fConfEnv->GetValue("AltroConf","ON");
   altroConf.ToUpper();
   if (altroConf != "OFF" ) { 
-   UInt_t altroResult = ExtractAltro(AliShuttleInterface::kDCS);
+   UInt_t altroResult = ExtractAltro(AliShuttleInterface::kDCS,dcsAliasMap);
    if (altroConf != "TRY" ) result+=altroResult;
    status = new TParameter<int>("altroResult",altroResult);
    resultArray->Add(status);
@@ -1098,10 +1101,10 @@ UInt_t AliTPCPreprocessor::ExtractQA(Int_t sourceFXS)
 //______________________________________________________________________________________________
 
 
-UInt_t AliTPCPreprocessor::ExtractAltro(Int_t sourceFXS)
+UInt_t AliTPCPreprocessor::ExtractAltro(Int_t sourceFXS, TMap* dcsMap)
 {
  //
- //  Read pulser calibration file from file exchage server
+ //  Read Altro configuration file from file exchage server
  //  Keep original entry from OCDB in case no new pulser calibration is available
  //
  TObjArray    *altroObjects=0;
@@ -1189,11 +1192,46 @@ UInt_t AliTPCPreprocessor::ExtractAltro(Int_t sourceFXS)
 
  Int_t nSectors = fROC->GetNSectors();
  Bool_t changed=false;
+ if (altroObjects == 0 ) altroObjects = new TObjArray;
+
+// extract list of active DDLs
+
+  Bool_t found; 
+  TString arrDDL(kNumDDL);
+  arrDDL.Append('0',kNumDDL);
+  for ( Int_t iDDL = 0; iDDL<kNumDDL; iDDL++ ) {
+    TString stringID = Form (kAmandaDDL.Data(),iDDL+kFirstDDL);
+    TPair *pair = (TPair*)dcsMap->FindObject(stringID.Data());
+    found = false;
+    if ( pair ) {
+        TObjArray *valueSet=(TObjArray*)pair->Value();
+        if ( valueSet) { 
+         AliDCSValue *val = (AliDCSValue*)valueSet->At(0);
+         if (val) found = val->GetBool();
+       }
+    } 
+    if (found){
+      arrDDL[iDDL] = '1';
+    } else { 
+      arrDDL[iDDL] = '0';
+    }    
+  }
+  TObjString *ddlArray = new TObjString;
+  ddlArray->SetString(arrDDL);
+  TMap *activeDDL = new TMap;
+  activeDDL->SetName("DDLArray");
+  TObjString *key = new TObjString("DDLArray");
+  activeDDL->Add(key,ddlArray);
+  altroObjects->Add(activeDDL);
+  changed=true;
+  
+
+// extract Altro configuration files
+
  for ( Int_t id=0; id<2; id++) {
    TList* list = GetFileSources(sourceFXS,idFXS[id].Data());
  
    if (list && list->GetEntries()>0) {
-      if (altroObjects == 0 ) altroObjects = new TObjArray;
 
 //  loop through all files from LDCs
 
index 0f80728..12ea857 100644 (file)
@@ -31,7 +31,7 @@ class AliTPCPreprocessor : public AliPreprocessor
     UInt_t  ExtractPulser(Int_t sourceFXS);
     UInt_t  ExtractCE(Int_t sourceFXS);
     UInt_t  ExtractQA(Int_t sourceFXS);
-    UInt_t  ExtractAltro(Int_t sourceFXS);
+    UInt_t  ExtractAltro(Int_t sourceFXS, TMap* dcsAliasMap);
     UInt_t  ExtractRaw(Int_t sourceFXS);
     AliTPCPreprocessor& operator = (const AliTPCPreprocessor& rhs);
 
index edaec73..5252870 100644 (file)
@@ -99,6 +99,7 @@
 #include "AliTPCSensorTempArray.h"
 #include "AliGRPObject.h"
 #include "AliTPCTransform.h"
+#include "AliTPCmapper.h"
 
 class AliCDBStorage;
 class AliTPCCalDet;
@@ -113,6 +114,7 @@ class AliTPCCalDet;
 #include "TObjString.h"
 #include "TString.h"
 #include "TDirectory.h"
+#include "TArrayI.h"
 #include "AliTPCCalPad.h"
 #include "AliTPCCalibPulser.h"
 #include "AliTPCCalibPedestal.h"
@@ -1819,5 +1821,72 @@ Double_t AliTPCcalibDB::GetVDriftCorrectionGy(Int_t timeStamp, Int_t run, Int_t
   return -result/250.; //normalized before
 }
 
+AliTPCCalPad* AliTPCcalibDB::MakeDeadMap(const char* nameMappingFile) {
+//
+//   Read list of active DDLs from OCDB entry
+//   Generate and return AliTPCCalPad containing 1 for all pads in active DDLs,
+//   0 for all pads in non-active DDLs. 
+//
+  char chinfo[1000];
+   
+  TFile *fileMapping = new TFile(nameMappingFile, "read");
+  AliTPCmapper *mapping = (AliTPCmapper*) fileMapping->Get("tpcMapping");
+  if (!mapping) {
+    sprintf(chinfo,"Failed to get mapping object from %s.  ...\n", nameMappingFile);
+    AliError (chinfo);
+    return 0;
+  }
+  
+  AliTPCCalPad *deadMap = new AliTPCCalPad("deadMap","deadMap");
+  if (!deadMap) {
+     AliError("Failed to allocate dead map AliTPCCalPad");
+     return 0;
+  }  
+  
+  /// get list of active DDLs from OCDB entry
+  Int_t idDDL=0;
+  if (!fALTROConfigData ) {
+     AliError("No ALTRO config OCDB entry available");
+     return 0; 
+  }
+  TMap *activeDDL = (TMap*)fALTROConfigData->FindObject("DDLArray");
+  TObjString *ddlArray=0;
+  if (activeDDL) {
+    ddlArray = (TObjString*)activeDDL->GetValue("DDLArray");
+    if (!ddlArray) {
+      AliError("Empty list of active DDLs in OCDB entry");
+      return 0;
+    }
+  } else { 
+    AliError("List of active DDLs not available in OCDB entry");
+    return 0;
+  }
+  TString arrDDL=ddlArray->GetString();
+  Int_t offset = mapping->GetTpcDdlOffset();
+  Double_t active;
+  for (Int_t i=0; i<mapping->GetNumDdl(); i++) {
+    idDDL= i+offset;
+    Int_t patch = mapping->GetPatchFromEquipmentID(idDDL);   
+    Int_t roc=mapping->GetRocFromEquipmentID(idDDL);
+    AliTPCCalROC *calRoc=deadMap->GetCalROC(roc);
+    if (calRoc) {
+     for ( Int_t branch = 0; branch < 2; branch++ ) {
+      for ( Int_t fec = 0; fec < mapping->GetNfec(patch, branch); fec++ ) {
+        for ( Int_t altro = 0; altro < 8; altro++ ) {
+         for ( Int_t channel = 0; channel < 16; channel++ ) {
+           Int_t hwadd     = mapping->CodeHWAddress(branch, fec, altro, channel);
+           Int_t row       = mapping->GetPadRow(patch, hwadd);        // row in a ROC (IROC or OROC)
+//              Int_t globalrow = mapping.GetGlobalPadRow(patch, hwadd);  // row in full sector (IROC plus OROC)
+           Int_t pad       = mapping->GetPad(patch, hwadd);
+           active=TString(arrDDL[i]).Atof();
+           calRoc->SetValue(row,pad,active);
+         } // end channel for loop
+        } // end altro for loop
+      } // end fec for loop
+     } // end branch for loop
+    } // valid calROC 
+   } // end loop on active DDLs
+   return deadMap;
+}
 
 
index 57507c6..e14ecfa 100644 (file)
@@ -153,6 +153,7 @@ class AliTPCcalibDB : public TObject
   //
   //
   
+  AliTPCCalPad* MakeDeadMap(const char *nameMappingFile="$ALICE_ROOT/TPC/Calib/tpcMapping.root");
   AliGRPObject * MakeGRPObjectFromMap(TMap *map);
   AliCTPTimeParams* GetCTPTimeParams() const {return fCTPTimeParams;}
   //Create a tree suited for diplaying with the AliTPCCalibViewerGUI
index b086cd0..e14e4f2 100644 (file)
@@ -101,6 +101,9 @@ public:
   Int_t  GetNfec(Int_t patch) const;
   Bool_t IsIROC(Int_t roc) const;
   Bool_t IsOROC(Int_t roc) const;
+  
+  Int_t  GetTpcDdlOffset() const {return fTpcDdlOffset;}
+  Int_t  GetNumDdl() const {return fNside*fNsector*fNrcu; }
 
  private: