]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCcalibDB.cxx
Updates to include list of active DDLs in AltroConfig OCDB entries
[u/mrichter/AliRoot.git] / TPC / AliTPCcalibDB.cxx
index 3fe05cfb570d8119e02dcff150633002582f80cf..5252870e881baf9fef4fe9569136375d8f17368e 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"
@@ -176,6 +178,7 @@ AliTPCcalibDB::AliTPCcalibDB():
   fPadGainFactor(0),
   fDedxGainFactor(0),
   fPadTime0(0),
+  fDistortionMap(0),
   fPadNoise(0),
   fPedestals(0),
   fCalibRaw(0),
@@ -215,6 +218,7 @@ AliTPCcalibDB::AliTPCcalibDB(const AliTPCcalibDB& ):
   fPadGainFactor(0),
   fDedxGainFactor(0),
   fPadTime0(0),
+  fDistortionMap(0),
   fPadNoise(0),
   fPedestals(0),
   fCalibRaw(0),
@@ -263,10 +267,6 @@ AliTPCcalibDB::~AliTPCcalibDB()
   // destructor
   //
   
-  // don't delete anything, CDB cache is active!
-  //if (fPadGainFactor) delete fPadGainFactor;
-  //if (fPadTime0) delete fPadTime0;
-  //if (fPadNoise) delete fPadNoise;
 }
 
 
@@ -315,6 +315,8 @@ void AliTPCcalibDB::Update(){
     //if (fPadGainFactor) delete fPadGainFactor;
     entry->SetOwner(kTRUE);
     fPadGainFactor = (AliTPCCalPad*)entry->GetObject();
+  }else{
+    AliFatal("TPC - Missing calibration entry")
   }
   //
   entry          = GetCDBEntry("TPC/Calib/TimeGain");
@@ -322,12 +324,16 @@ void AliTPCcalibDB::Update(){
     //if (fTimeGainSplines) delete fTimeGainSplines;
     entry->SetOwner(kTRUE);
     fTimeGainSplines = (TObjArray*)entry->GetObject();
+  }else{
+    AliFatal("TPC - Missing calibration entry")
   }
   //
   entry          = GetCDBEntry("TPC/Calib/GainFactorDedx");
   if (entry){
     entry->SetOwner(kTRUE);
     fDedxGainFactor = (AliTPCCalPad*)entry->GetObject();
+  }else{
+    AliFatal("TPC - Missing calibration entry")
   }
   //
   entry          = GetCDBEntry("TPC/Calib/PadTime0");
@@ -335,7 +341,20 @@ void AliTPCcalibDB::Update(){
     //if (fPadTime0) delete fPadTime0;
     entry->SetOwner(kTRUE);
     fPadTime0 = (AliTPCCalPad*)entry->GetObject();
+  }else{
+    AliFatal("TPC - Missing calibration entry")
+  }
+
+  entry          = GetCDBEntry("TPC/Calib/Distortion");
+  if (entry){
+    //if (fPadTime0) delete fPadTime0;
+    entry->SetOwner(kTRUE);
+    fDistortionMap =(TObjArray*)entry->GetObject();
+  }else{
+    //AliFatal("TPC - Missing calibration entry")
   }
+
+
   //
   //
   entry          = GetCDBEntry("TPC/Calib/PadNoise");
@@ -343,6 +362,8 @@ void AliTPCcalibDB::Update(){
     //if (fPadNoise) delete fPadNoise;
     entry->SetOwner(kTRUE);
     fPadNoise = (AliTPCCalPad*)entry->GetObject();
+  }else{
+    AliFatal("TPC - Missing calibration entry")
   }
 
   entry          = GetCDBEntry("TPC/Calib/Pedestals");
@@ -364,12 +385,16 @@ void AliTPCcalibDB::Update(){
     //if (fPadNoise) delete fPadNoise;
     entry->SetOwner(kTRUE);
     fParam = (AliTPCParam*)(entry->GetObject()->Clone());
+  }else{
+    AliFatal("TPC - Missing calibration entry")
   }
 
   entry          = GetCDBEntry("TPC/Calib/ClusterParam");
   if (entry){
     entry->SetOwner(kTRUE);
     fClusterParam = (AliTPCClusterParam*)(entry->GetObject()->Clone());
+  }else{
+    AliFatal("TPC - Missing calibration entry")
   }
 
   //ALTRO configuration data
@@ -377,6 +402,8 @@ void AliTPCcalibDB::Update(){
   if (entry){
     entry->SetOwner(kTRUE);
     fALTROConfigData=(TObjArray*)(entry->GetObject());
+  }else{
+    AliFatal("TPC - Missing calibration entry")
   }
   
   //Calibration Pulser data
@@ -393,18 +420,7 @@ void AliTPCcalibDB::Update(){
     fCEData=(TObjArray*)(entry->GetObject());
   }
   //RAW calibration data
-  entry          = GetCDBEntry("TPC/Calib/Raw");
-  if (entry){
-    entry->SetOwner(kTRUE);
-    TObjArray *arr=(TObjArray*)(entry->GetObject());
-    if (arr) fCalibRaw=(AliTPCCalibRaw*)arr->At(0);
-  }
-  //QA calibration data
-  entry          = GetCDBEntry("TPC/Calib/QA");
-  if (entry){
-    entry->SetOwner(kTRUE);
-    fDataQA=dynamic_cast<AliTPCdataQA*>(entry->GetObject());
-  }
+ //  entry          = GetCDBEntry("TPC/Calib/Raw");
   
   entry          = GetCDBEntry("TPC/Calib/Mapping");
   if (entry){
@@ -419,24 +435,15 @@ void AliTPCcalibDB::Update(){
     }
   }
 
-  //QA calibration data
+  //CTP calibration data
   entry          = GetCDBEntry("GRP/CTP/CTPtiming");
   if (entry){
     //entry->SetOwner(kTRUE);
     fCTPTimeParams=dynamic_cast<AliCTPTimeParams*>(entry->GetObject());
-  }
-  
-
-  //entry          = GetCDBEntry("TPC/Calib/ExB");
-  //if (entry) {
-  //  entry->SetOwner(kTRUE);
-  //  fExB=dynamic_cast<AliTPCExB*>(entry->GetObject()->Clone());
-  //}
+  }else{
+    AliFatal("TPC - Missing calibration entry")
+  }  
   //
-  // ExB  - calculate during initialization - in simulation /reconstruction
-  //      - not invoked here anymore
-  //fExB =  GetExB(-5,kTRUE);
-     //
   if (!fTransform) {
     fTransform=new AliTPCTransform(); 
     fTransform->SetCurrentRun(AliCDBManager::Instance()->GetRun());
@@ -446,6 +453,33 @@ void AliTPCcalibDB::Update(){
   AliCDBManager::Instance()->SetCacheFlag(cdbCache); // reset original CDB cache
 }
 
+void AliTPCcalibDB::UpdateNonRec(){
+  //
+  // Update/Load the parameters which are important for QA studies
+  // and not used yet for the reconstruction
+  //
+   //RAW calibration data
+  AliCDBEntry * entry=0;
+  entry          = GetCDBEntry("TPC/Calib/Raw");
+  if (entry){
+    entry->SetOwner(kTRUE);
+    TObjArray *arr=(TObjArray*)(entry->GetObject());
+    if (arr) fCalibRaw=(AliTPCCalibRaw*)arr->At(0);
+  }
+  //QA calibration data
+  entry          = GetCDBEntry("TPC/Calib/QA");
+  if (entry){
+    entry->SetOwner(kTRUE);
+    fDataQA=dynamic_cast<AliTPCdataQA*>(entry->GetObject());
+  }
+  // High voltage
+  entry = AliCDBManager::Instance()->Get("TPC/Calib/HighVoltage",fRun);
+  if (entry)  {
+    fVoltageArray.AddAt(entry->GetObject(),fRun);
+  }
+
+}
+
 
 
 void AliTPCcalibDB::CreateObjectList(const Char_t *filename, TObjArray *calibObjects)
@@ -851,7 +885,7 @@ void AliTPCcalibDB::UpdateRunInformations( Int_t run, Bool_t force){
   //
   // - > Don't use it for reconstruction - Only for Calibration studies
   //
-  if (run<0) return;
+  if (run<=0) return;
   AliCDBEntry * entry = 0;
   if (run>= fRunList.fN){
     fRunList.Set(run*2+1);
@@ -868,6 +902,7 @@ void AliTPCcalibDB::UpdateRunInformations( Int_t run, Bool_t force){
     fALTROConfigData->Expand(run*2+1);    // ALTRO configuration data
     fPulserData->Expand(run*2+1);         // Calibration Pulser data
     fCEData->Expand(run*2+1);             // CE data
+    if (!fTimeGainSplines) fTimeGainSplines = new TObjArray(run*2+1);
     fTimeGainSplines->Expand(run*2+1); // Array of AliSplineFits: at 0 MIP position in
   }
   if (fRunList[run]>0 &&force==kFALSE) return;
@@ -895,19 +930,20 @@ void AliTPCcalibDB::UpdateRunInformations( Int_t run, Bool_t force){
     fGoofieArray.AddAt(entry->GetObject(),run);
   }
   //
-  entry = AliCDBManager::Instance()->Get("TPC/Calib/HighVoltage",run);
-  if (entry)  {
-    fVoltageArray.AddAt(entry->GetObject(),run);
-  }
+  
   //
   entry = AliCDBManager::Instance()->Get("TPC/Calib/TimeGain",run);
   if (entry)  {
     fTimeGainSplinesArray.AddAt(entry->GetObject(),run);
+  }else{
+    AliFatal("TPC - Missing calibration entry TimeGain")
   }
   //
   entry = AliCDBManager::Instance()->Get("TPC/Calib/TimeDrift",run);
   if (entry)  {
     fDriftCorrectionArray.AddAt(entry->GetObject(),run);
+  }else{
+    AliFatal("TPC - Missing calibration entry TimeDrift")
   }
   //
   entry = AliCDBManager::Instance()->Get("TPC/Calib/Temperature",run);
@@ -1583,7 +1619,8 @@ Bool_t AliTPCcalibDB::CreateGUITree(const char* filename){
     AliError("Default Storage not set. Cannot create calibration Tree!");
     return kFALSE;
   }
-  
+  UpdateNonRec();  // load all infromation now
+
   AliTPCPreprocessorOnline prep;
   //noise and pedestals
   if (GetPedestals()) prep.AddComponent(new AliTPCCalPad(*(GetPedestals())));
@@ -1784,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;
+}