X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDcalibDB.cxx;h=acd70b6a258417947d65139cdf82b0fab091d56f;hb=c88497a0987ccb6da38c8cd29257d94d5f446aea;hp=f3f6ace2285c93d7a91c729f0b2582864048569a;hpb=f16844ef37d3ae5bdadaf6cadfc2ad25fa27a851;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDcalibDB.cxx b/TRD/AliTRDcalibDB.cxx index f3f6ace2285..acd70b6a258 100644 --- a/TRD/AliTRDcalibDB.cxx +++ b/TRD/AliTRDcalibDB.cxx @@ -28,6 +28,7 @@ // // /////////////////////////////////////////////////////////////////////////////// +#include #include #include @@ -36,15 +37,18 @@ #include "AliLog.h" #include "AliTRDPIDReference.h" +#include "AliTRDPIDResponseObject.h" #include "AliTRDcalibDB.h" #include "AliTRDtrapConfig.h" #include "AliTRDtrapConfigHandler.h" #include "AliTRDCommonParam.h" +#include "AliTRDgeometry.h" #include "Cal/AliTRDCalROC.h" #include "Cal/AliTRDCalPad.h" #include "Cal/AliTRDCalDet.h" #include "Cal/AliTRDCalDCS.h" +#include "Cal/AliTRDCalDCSFEE.h" #include "Cal/AliTRDCalDCSv2.h" #include "Cal/AliTRDCalDCSFEEv2.h" #include "Cal/AliTRDCalPID.h" @@ -196,7 +200,7 @@ AliTRDcalibDB::~AliTRDcalibDB() } Invalidate(); - + fgInstance = 0; } //_caching functions____________________________________________________________ @@ -279,8 +283,14 @@ const TObject *AliTRDcalibDB::GetCachedCDBObject(Int_t id) break; case 7: // Online gain table ID 7 - return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Gaintbl_Uniform_FGAN8_2012-01"); + return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Gaintbl_Uniform_FGAN8_2012-01"); + break; + case 8: + // Online gain table ID 8 + return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Krypton_2012-01"); break; + default: + AliError(Form("unknown gaintable requested with ID")); } break; @@ -312,7 +322,7 @@ const TObject *AliTRDcalibDB::GetCachedCDBObject(Int_t id) return CacheCDBEntry(kIDFEE ,"TRD/Calib/FEE"); break; case kIDTrapConfig : - return CacheCDBEntry(kIDFEE ,"TRD/Calib/TrapConfig"); + return CacheCDBEntry(kIDTrapConfig ,"TRD/Calib/TrapConfig"); break; case kIDDCS : return CacheCDBEntry(kIDDCS ,"TRD/Calib/DCS"); @@ -369,6 +379,8 @@ const TObject *AliTRDcalibDB::CacheCDBEntry(Int_t id, const char *cdbPath) fCDBEntries[id] = GetCDBEntry(cdbPath); if (fCDBEntries[id]) { fCDBCache[id] = fCDBEntries[id]->GetObject(); + if (id == kIDOnlineGainFactor) + AliInfo(Form("loaded gain table: %s", fCDBEntries[id]->GetId().GetAliCDBPath().GetPath().Data())); } } @@ -724,40 +736,16 @@ Float_t AliTRDcalibDB::GetT0Average(Int_t det) } -//_____________________________________________________________________________ -Float_t AliTRDcalibDB::GetGainFactor(Int_t det, Int_t col, Int_t row) -{ - // - // Returns the gain factor for the given pad. - // - - const AliTRDCalPad *calPad = dynamic_cast - (GetCachedCDBObject(kIDGainFactorPad)); - if (!calPad) { - return -1; - } - - AliTRDCalROC *roc = calPad->GetCalROC(det); - if (!roc) { - return -1; - } - - const AliTRDCalDet *calChamber = dynamic_cast - (GetCachedCDBObject(kIDGainFactorChamber)); - if (!calChamber) { - return -1; - } - - return calChamber->GetValue(det) * roc->GetValue(col,row); - -} - //_____________________________________________________________________________ AliTRDCalOnlineGainTableROC* AliTRDcalibDB::GetOnlineGainTableROC(Int_t det) { // // Returns the online gain factor table for a given ROC. // + + if (!HasOnlineFilterGain()) { + return 0x0; + } const AliTRDCalOnlineGainTable *calOnline = dynamic_cast @@ -776,6 +764,10 @@ Float_t AliTRDcalibDB::GetOnlineGainFactor(Int_t det, Int_t col, Int_t row) // // Returns the online gain factor for the given pad. // + + if (!HasOnlineFilterGain()) { + return -1; + } const AliTRDCalOnlineGainTable *calOnline = dynamic_cast @@ -811,6 +803,34 @@ AliTRDCalROC *AliTRDcalibDB::GetGainFactorROC(Int_t det) } +//_____________________________________________________________________________ +Float_t AliTRDcalibDB::GetGainFactor(Int_t det, Int_t col, Int_t row) +{ + // + // Returns the gain factor for the given pad. + // + + const AliTRDCalPad *calPad = dynamic_cast + (GetCachedCDBObject(kIDGainFactorPad)); + if (!calPad) { + return -1; + } + + AliTRDCalROC *roc = calPad->GetCalROC(det); + if (!roc) { + return -1; + } + + const AliTRDCalDet *calChamber = dynamic_cast + (GetCachedCDBObject(kIDGainFactorChamber)); + if (!calChamber) { + return -1; + } + + return calChamber->GetValue(det) * roc->GetValue(col,row); + +} + //_____________________________________________________________________________ const AliTRDCalDet *AliTRDcalibDB::GetGainFactorDet() { @@ -894,81 +914,133 @@ Float_t AliTRDcalibDB::GetPRFWidth(Int_t det, Int_t col, Int_t row) } //_____________________________________________________________________________ -Int_t AliTRDcalibDB::GetNumberOfTimeBinsDCS() +Int_t AliTRDcalibDB::ExtractTimeBinsFromString(TString tbstr) { - // - // Returns Number of time bins from the DCS - // + // Check if there is any content in the string first + if (tbstr.Length() == 0) { + AliError("Parameter for number of timebins is empty!"); + return -1; + } - Int_t nMixed = -2; // not the same number for all chambers - Int_t nUndef = -1; // default value - has not been set! - Int_t nTbSor = nUndef; - Int_t nTbEor = nUndef; - Int_t calver = 0; // Check CalDCS version + // Check if we have the correct config parameter + TString tbident = "tb"; + TString tbsubstr = tbstr(0,2); + if (!tbsubstr.EqualTo(tbident)) { + AliError(Form("Parameter for number of timebins is corrupted (%s)!", tbstr.Data())); + return -1; + } - const TObjArray *dcsArr = dynamic_cast(GetCachedCDBObject(kIDDCS)); - if (!dcsArr) { - AliError("No DCS object found!"); - return nUndef; + tbstr.Remove(0,2); + // check if there is more than a number + if (!tbstr.IsDigit()) { + AliError(Form("Parameter for number of timebins is corrupted (%s)!", tbstr.Data())); + return -1; } - if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCS")) calver = 1; - if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCSv2")) calver = 2; + return tbstr.Atoi(); + +} +//_____________________________________________________________________________ +Int_t AliTRDcalibDB::GetNumberOfTimeBinsDCSBoard(){ + // This is an old way to extract the number of time bins, + // only to be used as a fallback to see whether there's + // a patched OCDB object! + + Int_t nTB=-1; + // Get the array with SOR and EOR + const TObjArray *dcsArr = dynamic_cast(GetCachedCDBObject(kIDDCS)); + if(!dcsArr) + return -1; // Error + // Check CalDCS version + Int_t calver = 0; + if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCS")) calver = 1; + else if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCSv2")) calver = 2; + // CalDCS version 1 if (calver == 1) { // DCS object - const AliTRDCalDCS *calDCSsor = dynamic_cast(dcsArr->At(0)); - const AliTRDCalDCS *calDCSeor = dynamic_cast(dcsArr->At(1)); - if (!calDCSsor) { - // the SOR file is mandatory - AliError("NO SOR AliTRDCalDCS object found in CDB file!"); - return nUndef; - } - if (!calDCSeor) { - // this can happen if the run is shorter than a couple of seconds. - AliWarning("NO EOR AliTRDCalDCS object found in CDB file."); - } - - // get the numbers - nTbSor = calDCSsor->GetGlobalNumberOfTimeBins(); - if (calDCSeor) nTbEor = calDCSeor->GetGlobalNumberOfTimeBins(); - - } else if (calver == 2) { - // DCSv2 object - const AliTRDCalDCSv2 *calDCSsorv2 = dynamic_cast(dcsArr->At(0)); - const AliTRDCalDCSv2 *calDCSeorv2 = dynamic_cast(dcsArr->At(1)); - if (!calDCSsorv2) { - // the SOR file is mandatory - AliError("NO SOR AliTRDCalDCSv2 object found in CDB file!"); - return nUndef; + AliTRDCalDCS *calSOR = dynamic_cast(dcsArr->At(0)); + // SOR mandantory + if(!calSOR) + return -1; // Error + else + nTB=calSOR->GetGlobalNumberOfTimeBins(); + AliTRDCalDCS *calEOR = dynamic_cast(dcsArr->At(1)); + if(calEOR && calEOR->GetGlobalNumberOfTimeBins()!=nTB) + return -2; // Mixed + } + else if (calver == 2) { + // DCS object + AliTRDCalDCSv2 *calSOR = dynamic_cast(dcsArr->At(0)); + // SOR mandantory + if(!calSOR) + return -1; // Error + else + nTB=calSOR->GetGlobalNumberOfTimeBins(); + AliTRDCalDCSv2 *calEOR = dynamic_cast(dcsArr->At(1)); + if(calEOR && calEOR->GetGlobalNumberOfTimeBins()!=nTB) + return -2; // Mixed + } + else{ + // No version 1 nor version 2 object + return -1; // Error + } + + // All well + return nTB; +} +//_____________________________________________________________________________ +Int_t AliTRDcalibDB::GetNumberOfTimeBinsDCS() +{ + // + // Returns number of time bins from the DCS + // + + // Initialize with values indicating no information + TString cfg=""; + Int_t nTB = -1; + // Extract the global configuration name + GetGlobalConfigurationByChamber(cfg,kTimebin); + // Extract the number of time bins from + // the global configuration + if(cfg.Length()>0){ + nTB = ExtractTimeBinsFromString(cfg); + } + if(nTB>0){ + // All well, we could extract the number + // of time bins from the configuration name + return nTB; + } + else{ + // No number of time bins from config name. + // No board responded or similar. + // We patched some OCDB entries with + // only the global number of time bins set. + // We should get these here + nTB=GetNumberOfTimeBinsDCSBoard(); + if(nTB>0){ + AliWarning("Using old method for number of time bins." + " This is probably a patched OCDB entry"); + return nTB; } - if (!calDCSeorv2) { - // this can happen if the run is shorter than a couple of seconds. - AliWarning("NO EOR AliTRDCalDCSv2 object found in CDB file."); + else{ + // Error + AliError("No number of time bins either" + " from config name or patched OCDB entry"); + return -1; } - - // get the numbers - nTbSor = calDCSsorv2->GetGlobalNumberOfTimeBins(); - if (calDCSeorv2) nTbEor = calDCSeorv2->GetGlobalNumberOfTimeBins(); - - } else AliError("NO DCS/DCSv2 OCDB entry found!"); - - // if they're the same return the value - // -2 means mixed, -1: no data, >= 0: good number of time bins - if (nTbSor == nTbEor) return nTbSor; - - // if they're differing: - if (nTbSor == nMixed || nTbEor == nMixed) { - AliWarning("Inconsistent number of time bins found!"); - return nMixed; } - // one is undefined, the other ok -> return that one - if (nTbSor == nUndef) return nTbEor; - if (nTbEor == nUndef) return nTbSor; - - // only remains: two different numbers >= 0 - return nMixed; + + // // Get the corresponding parameter + // TString cfgstr = "", cfgname = ""; + // GetGlobalConfiguration(cfgname); + // if(cfgname.Length()==0) + // return -1; + // GetDCSConfigParOption(cfgname, kTimebin, 0, cfgstr); + // if(cfgstr.Length()==0) + // return -1; + // return ExtractTimeBinsFromString(cfgstr); } @@ -979,44 +1051,9 @@ void AliTRDcalibDB::GetFilterType(TString &filterType) // Returns the filter type // - const TObjArray *dcsArr = dynamic_cast(GetCachedCDBObject(kIDDCS)); - if(!dcsArr){ - filterType = ""; - return; - } - - Int_t esor = 0; // Take SOR - Int_t calver = 0; // Check CalDCS version - if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCS")) calver = 1; - if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCSv2")) calver = 2; - - if (calver == 1) { - - // DCS object - const AliTRDCalDCS *calDCS = dynamic_cast(dcsArr->At(esor)); - if(!calDCS){ - filterType = ""; - return; - } - filterType = calDCS->GetGlobalFilterType(); - - } - else if (calver == 2) { - - // DCSv2 object - const AliTRDCalDCSv2 *calDCSv2 = dynamic_cast(dcsArr->At(esor)); - if(!calDCSv2){ - filterType = ""; - return; - } - filterType = calDCSv2->GetGlobalFilterType(); - - } - else { - - AliError("NO DCS/DCSv2 OCDB entry found!"); - - } + TString cfgname = ""; + GetGlobalConfiguration(cfgname); + GetDCSConfigParOption(cfgname, kFltrSet, 0, filterType); } @@ -1063,35 +1100,30 @@ Int_t AliTRDcalibDB::GetOnlineGainTableID() break; } } - if (tableName.CompareTo("Krypton_2011-01") == 0) { + if (tableName.CompareTo("Krypton_2011-01") == 0) fOnlineGainTableID = 1; - return fOnlineGainTableID; - } - if (tableName.CompareTo("Gaintbl_Uniform_FGAN0_2011-01") == 0) { + else if (tableName.CompareTo("Gaintbl_Uniform_FGAN0_2011-01") == 0) fOnlineGainTableID = 2; - return fOnlineGainTableID; - } - if (tableName.CompareTo("Gaintbl_Uniform_FGAN8_2011-01") == 0) { + else if (tableName.CompareTo("Gaintbl_Uniform_FGAN8_2011-01") == 0) fOnlineGainTableID = 3; - return fOnlineGainTableID; - } - if (tableName.CompareTo("Krypton_2011-02") == 0) { + else if (tableName.CompareTo("Krypton_2011-02") == 0) fOnlineGainTableID = 4; - return fOnlineGainTableID; - } - if (tableName.CompareTo("Krypton_2011-03") == 0) { + else if (tableName.CompareTo("Krypton_2011-03") == 0) fOnlineGainTableID = 5; - return fOnlineGainTableID; - } - if (tableName.CompareTo("Gaintbl_Uniform_FGAN0_2012-01") == 0) { + else if (tableName.CompareTo("Gaintbl_Uniform_FGAN0_2012-01") == 0) fOnlineGainTableID = 6; - return fOnlineGainTableID; - } - if (tableName.CompareTo("Gaintbl_Uniform_FGAN8_2012-01") == 0) { + else if (tableName.CompareTo("Gaintbl_Uniform_FGAN8_2012-01") == 0) fOnlineGainTableID = 7; - return fOnlineGainTableID; - } + else if (tableName.CompareTo("Krypton_2012-01") == 0) + fOnlineGainTableID = 8; + else + AliFatal(Form("unknown gaintable <%s> requested", tableName.Data())); + AliInfo(Form("looking for gaintable: %s (id %i)", + tableName.Data(), fOnlineGainTableID)); + + if (fOnlineGainTableID > 0) + return fOnlineGainTableID; } else { @@ -1113,45 +1145,272 @@ void AliTRDcalibDB::GetGlobalConfiguration(TString &config) const TObjArray *dcsArr = dynamic_cast(GetCachedCDBObject(kIDDCS)); if(!dcsArr){ + AliError("No DCS CDB Object available!"); config = ""; return; } - Int_t esor = 0; // Take SOR - Int_t calver = 0; // Check CalDCS version - if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCS")) calver = 1; - if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCSv2")) calver = 2; + Int_t idSOR = 0, idEOR=1; // The index of SOR and EOR + Bool_t hasSOR = (dcsArr->At(idSOR)); + Bool_t hasEOR = (dcsArr->At(idEOR)); + TString cfgSOR = "", cfgEOR = ""; // The configuration at SOR/EOR - if (calver == 1) { + // The SOR object is mandatory + if (!hasSOR) { + AliError("NO SOR object found in CDB file!"); + config = ""; + return; + } + if (!hasEOR) AliWarning("NO EOR object found in CDB file!"); - // DCS object - const AliTRDCalDCS *calDCS = dynamic_cast(dcsArr->At(esor)); - if(!calDCS){ - config = ""; - return; - } - config = calDCS->GetGlobalConfigName(); + // Check CalDCS version + Int_t calver = 0; + if (!strcmp(dcsArr->At(idSOR)->ClassName(),"AliTRDCalDCS")) calver = 1; + else if (!strcmp(dcsArr->At(idSOR)->ClassName(),"AliTRDCalDCSv2")) calver = 2; + // Get the configuration strings + if (calver == 1) { + // DCS object + const AliTRDCalDCS *calSOR = dynamic_cast(dcsArr->At(idSOR)); + cfgSOR = calSOR->GetGlobalConfigName(); + if (hasEOR) { + const AliTRDCalDCS *calEOR = dynamic_cast(dcsArr->At(idEOR)); + cfgEOR = calEOR->GetGlobalConfigName(); + } } else if (calver == 2) { - // DCSv2 object - const AliTRDCalDCSv2 *calDCSv2 = dynamic_cast(dcsArr->At(esor)); - if(!calDCSv2){ - config = ""; - return; - } - config = calDCSv2->GetGlobalConfigName(); - + const AliTRDCalDCSv2 *calv2SOR = dynamic_cast(dcsArr->At(idSOR)); + cfgSOR = calv2SOR->GetGlobalConfigName(); + if (hasEOR) { + const AliTRDCalDCSv2 *calv2EOR = dynamic_cast(dcsArr->At(idEOR)); + cfgEOR = calv2EOR->GetGlobalConfigName(); + } } else { - AliError("NO DCS/DCSv2 OCDB entry found!"); + config = ""; + return; + } + // If there is no EOR entry, return the SOR value + if (!hasEOR || cfgEOR.Length()==0) { + config = cfgSOR; + return; } + // Check if the configuration is the same for both + if (cfgSOR.EqualTo(cfgEOR)) { + config = cfgSOR; + return; + } + + // When both SOR and EOR have an entry but are different, the config is not defined + AliError("Inconsistent configuration at start and end of run found!"); + config = ""; + return; + } +//_____________________________________________________________________________ +void AliTRDcalibDB::GetGlobalConfigurationByChamber(TString &config,Int_t par, Int_t opt) +{ + // + // Get Configuration from the DCS + // + + // par is the enumeration from kFltrSet = 1 ... kAddOpti 6 + // example: + // cf_p_nozs_tb30_csmtrk_ptrg + // par 1 2 3 4 5 + // kFltrSet kTimebin kTrigSet + // kReadout kTrkMode + // opt is 0 for the value itself and 1,2,3 for the first, second option + // opt has standard value of 0 in header file + + + // The point is that we extract the parameter/option for + // each of the 540 chambers and compare only this + // parameter/option for a global value, not the full + // configuration name with all parameters + + // Get the array with SOR and EOR + const TObjArray *dcsArr = dynamic_cast(GetCachedCDBObject(kIDDCS)); + if(!dcsArr){ + AliError("No DCS CDB Object available!"); + config = ""; + return; + } + + // Check CalDCS version + Int_t calver = 0; + if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCS")) calver = 1; + else if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCSv2")) calver = 2; + // + // Get the configuration strings + // + // CalDCS version 1 + if (calver == 1) { + + // Loop over SOR/EOR + for(Int_t iSEOR=0;iSEOR<2;iSEOR++){ + + // DCS object + AliTRDCalDCS *cal = dynamic_cast(dcsArr->At(iSEOR)); + if(!cal){ + // SOR mandantory + if(iSEOR==0){ + AliError("NO SOR object found in CDB file!"); + config = ""; + return; + } + else{ + AliWarning("NO EOR object found in CDB file!"); + continue; + } + } // Check DCS object is there + + // Loop over 540 chambers + { + Int_t iDet=0; + // Find the first chamber in SOR + if(iSEOR==0){ + // Loop until we find the first chamber + for(;iDetGetCalDCSFEEObj(iDet); + // Check it's an installed chamber that responded + if(DCSFEEObj && !DCSFEEObj->GetStatusBit()) { + + // We ask for a valid configuration name starting with cf_ + if(DCSFEEObj->GetConfigName().BeginsWith("cf_")){ + // Set the parameter of the first good ROC as global, + // we take only the requested part! + GetDCSConfigParOption(DCSFEEObj->GetConfigName(), par, opt, config); + // Increase counter to not look at this chamber again + // and break loop + iDet++; + break; + } // End: valid config name + } // End: first good chamber + } // End: find the first chamber + } // End: is SOR + + // Now compare the other chambers with the first one + for(;iDetGetCalDCSFEEObj(iDet); + // Check it's an installed chamber that responded + if(DCSFEEObj && !DCSFEEObj->GetStatusBit()) { + + // We ask for a valid configuration name starting with cf_ + if(DCSFEEObj->GetConfigName().BeginsWith("cf_")){ + + // Get the parameter/option of this chamber + TString tmpcfg; + GetDCSConfigParOption(DCSFEEObj->GetConfigName(), par, opt, tmpcfg); + // Compare with the global value + if(config.CompareTo(tmpcfg)){ + // Two cases mixed or changed during run + if(iSEOR==0){ + AliError("Mixed DCS configuration for different chambers!"); + config="mixed"; + return; + } else { + AliError("Inconsistent configuration at start and end of run found!"); + config = ""; + return; + } + } + }// Valid config name + }// Good chamber + } // Second half loop + } // Loop over 540 chambers + } // Loop over SOR / EOR + } // End calver 1 + // + // CalDCS version 2 + // + else if (calver == 2) { + + // Loop over SOR/EOR + for(Int_t iSEOR=0;iSEOR<2;iSEOR++){ + + // DCS object + AliTRDCalDCSv2 *cal = dynamic_cast(dcsArr->At(iSEOR)); + if(!cal){ + // SOR mandantory + if(iSEOR==0){ + AliError("NO SOR object found in CDB file!"); + config = ""; + return; + } + else{ + AliWarning("NO EOR object found in CDB file!"); + continue; + } + } // Check DCS object is there + + // Loop over 540 chambers + { + Int_t iDet=0; + // Find the first chamber in SOR + if(iSEOR==0){ + // Loop until we find the first chamber + for(;iDetGetCalDCSFEEObj(iDet); + // Check it's an installed chamber that responded + if(DCSFEEObj && !DCSFEEObj->GetStatusBit()) { + // Check for a valid config name + if(DCSFEEObj->GetConfigName().BeginsWith("cf_")){ + + // Set the parameter of the first good ROC as global, + // we take only the requested part! + GetDCSConfigParOption(DCSFEEObj->GetConfigName(), par, opt, config); + // Increase counter to not look at this chamber again + // and break loop + iDet++; + break; + } // End: valid config name + } // End: first good chamber + } // End: find the first chamber + } // End: is SOR + + // Now compare the other chambers with the first one + for(;iDetGetCalDCSFEEObj(iDet); + // Check it's an installed chamber that responded + if(DCSFEEObj && !DCSFEEObj->GetStatusBit()) { + + // Check for a valid config name + if(DCSFEEObj->GetConfigName().BeginsWith("cf_")){ + + // Get the parameter/option of this chamber + TString tmpcfg; + GetDCSConfigParOption(DCSFEEObj->GetConfigName(), par, opt, tmpcfg); + // Compare with the global value + if(config.CompareTo(tmpcfg)){ + // Two cases mixed or changed during run + if(iSEOR==0){ + AliError("Mixed DCS configuration for different chambers!"); + config="mixed"; + return; + } else { + AliError("Inconsistent configuration at start and end of run found!"); + config = ""; + return; + } + } + } // End: valid config name + } // End: Good chamber + } // End: Second half loop + } // Loop over 540 chambers + } // Loop over SOR / EOR + } // End calver 2 + else { + AliError("NO DCS/DCSv2 OCDB entry found!"); + config = ""; + return; + } +} //_____________________________________________________________________________ void AliTRDcalibDB::GetGlobalConfigurationVersion(TString &version) { @@ -1201,20 +1460,91 @@ void AliTRDcalibDB::GetGlobalConfigurationVersion(TString &version) } //_____________________________________________________________________________ -Bool_t AliTRDcalibDB::HasOnlineFilterPedestal() +Int_t AliTRDcalibDB::GetNumberOfParsDCS(TString cname, Char_t delimiter) +{ + // Get the number of configuration parameters from the DCS config + + //AliInfo(Form("\"%s\" tokenized by \"%c\"", cname.Data(), delimiter)); + if(!cname.Length()) return -1; // -1 for the "cf" + Int_t nconf(0); + for(Int_t ich(1); ichAt(cfgType))->GetString(), odelim); + carr->Delete(); delete carr; + return nopt; +} + +//_____________________________________________________________________________ +void AliTRDcalibDB::GetDCSConfigParOption(TString cname, Int_t cfgType, Int_t option, TString &cfgo) { // - // Checks whether pedestal filter was applied online + // Get a configuration (see enum in header file) or the options of a configuration + // option == 0 returns the configuration itself + // option > 0 returns the optional parameter Nr. (option) of the configuration (cfgType) // - TString cname; + Char_t cdelim = '_', // define the delimiters + odelim = '-'; - // Temporary: Get the filter config from the configuration name - GetGlobalConfiguration(cname); - TString filterconfig = cname(cname.First("_") + 1, cname.First("-") - cname.First("_") - 1); + Int_t nconfig = GetNumberOfParsDCS(cname, cdelim); + // protect + if (nconfig == -1) { + AliError("DCS configuration name empty!"); + cfgo = ""; + return; + } else if (nconfig < cfgType) { + AliError(Form("Not enough parameters in DCS configuration name!" + " Name %s",cname.Data())); + cfgo = ""; + return; + } + + TObjArray *carr = cname.Tokenize(cdelim); + TString cfgString(((TObjString*)carr->At(cfgType))->GetString()); + Int_t noptions = GetNumberOfParsDCS(cfgString, odelim); + // protect + if (noptions < option) { + AliError(Form("Not enough options in DCS configuration name!" + " Name %s",cname.Data())); + cfgo = ""; + carr->Delete(); delete carr; + return; + } + TObjArray *oarr = cfgString.Tokenize(odelim); + cfgo = ((TObjString*)oarr->At(option))->GetString(); + carr->Delete(); delete carr; + oarr->Delete(); delete oarr; + return; - // TString filterconfig; - //GetFilterType(filterconfig); +} + +//_____________________________________________________________________________ +Bool_t AliTRDcalibDB::HasOnlineFilterPedestal() +{ + // + // Checks whether pedestal filter was applied online + // + + TString filterconfig; + GetFilterType(filterconfig); return filterconfig.Contains("p"); @@ -1227,14 +1557,8 @@ Bool_t AliTRDcalibDB::HasOnlineFilterGain() // Checks whether online gain filter was applied // - TString cname; - - // Temporary: Get the filter config from the configuration name - GetGlobalConfiguration(cname); - TString filterconfig = cname(cname.First("_") + 1, cname.First("-") - cname.First("_") - 1); - - //TString filterconfig; - //GetFilterType(filterconfig); + TString filterconfig; + GetFilterType(filterconfig); return filterconfig.Contains("g"); @@ -1247,14 +1571,8 @@ Bool_t AliTRDcalibDB::HasOnlineTailCancellation() // Checks whether online tail cancellation was applied // - TString cname; - - // Temporary: Get the filter config from the configuration name - GetGlobalConfiguration(cname); - TString filterconfig = cname(cname.First("_") + 1, cname.First("-") - cname.First("_") - 1); - - //TString filterconfig; - //GetFilterType(filterconfig); + TString filterconfig; + GetFilterType(filterconfig); return filterconfig.Contains("t"); @@ -1475,6 +1793,23 @@ Bool_t AliTRDcalibDB::IsChamberBadCalibrated(Int_t det) } +//_____________________________________________________________________________ +Bool_t AliTRDcalibDB::IsChamberNotCalibrated(Int_t det) +{ + // + // Returns status, see name of functions for details ;-) + // + + const AliTRDCalChamberStatus * cal = dynamic_cast + (GetCachedCDBObject(kIDChamberStatus)); + if (!cal) { + return -1; + } + + return cal->IsNotCalibrated(det); + +} + //_____________________________________________________________________________ const AliTRDCalPID *AliTRDcalibDB::GetPIDObject(AliTRDpidUtil::ETRDPIDMethod method) { @@ -1496,18 +1831,20 @@ const AliTRDCalPID *AliTRDcalibDB::GetPIDObject(AliTRDpidUtil::ETRDPIDMethod met } //_____________________________________________________________________________ -AliTRDPIDResponse *AliTRDcalibDB::GetPIDResponse(AliTRDPIDResponse::ETRDPIDMethod method) +AliTRDPIDResponse *AliTRDcalibDB::GetPIDResponse(AliTRDPIDResponse::ETRDPIDMethod /*method*/) { // // Returns the PID response object for 1D-LQ // if (!fPIDResponse) { + AliDebug(2, "Setting new PID response."); fPIDResponse = new AliTRDPIDResponse; // Load Reference Histos from OCDB - fPIDResponse->SetPIDmethod(method); +// if(method == AliTRDPIDResponse::kLQ1D){ + //fPIDResponse->SetPIDmethod(AliTRDPIDResponse::kLQ1D); const TObjArray *references = dynamic_cast(GetCachedCDBObject(kIDPIDLQ1D)); TIter refs(references); @@ -1516,8 +1853,14 @@ AliTRDPIDResponse *AliTRDcalibDB::GetPIDResponse(AliTRDPIDResponse::ETRDPIDMetho Bool_t hasReference = kFALSE; while ((obj = refs())){ if ((ref = dynamic_cast(obj))){ - fPIDResponse->Load(ref); + AliDebug(2, "Setting new PID response object."); + TDirectory *bkpdir = gDirectory; + gROOT->cd(); + AliTRDPIDResponseObject *ro = new AliTRDPIDResponseObject; + ro->SetPIDReference(ref); + fPIDResponse->SetPIDResponseObject(ro); hasReference = kTRUE; + gDirectory = bkpdir; break; } } @@ -1525,9 +1868,10 @@ AliTRDPIDResponse *AliTRDcalibDB::GetPIDResponse(AliTRDPIDResponse::ETRDPIDMetho if (!hasReference) { AliError("Reference histograms not found in the OCDB"); } - } +// } + return fPIDResponse; } @@ -1764,10 +2108,8 @@ AliTRDtrapConfig* AliTRDcalibDB::GetTrapConfig() else { if ((fTrapConfigName.Length() <= 0) || (fTrapConfigVersion.Length() <= 0)) { // query the configuration to be used - TString configName; - this->GetGlobalConfiguration(configName); - TString configVersion; - this->GetGlobalConfigurationVersion(configVersion); + this->GetGlobalConfiguration(fTrapConfigName); + this->GetGlobalConfigurationVersion(fTrapConfigVersion); } // try to load the requested configuration @@ -1776,7 +2118,8 @@ AliTRDtrapConfig* AliTRDcalibDB::GetTrapConfig() // if we still don't have a valid TRAPconfig, create a default one if (!fTrapConfig) { AliWarning("Falling back to default configuration"); - fTrapConfig = new AliTRDtrapConfig("default", "default TRAP configuration"); + static AliTRDtrapConfig trapConfigDefault("default", "default TRAP configuration"); + fTrapConfig = &trapConfigDefault; AliTRDtrapConfigHandler cfgHandler(fTrapConfig); cfgHandler.Init(); cfgHandler.LoadConfig(); @@ -1784,6 +2127,47 @@ AliTRDtrapConfig* AliTRDcalibDB::GetTrapConfig() AliInfo(Form("using TRAPconfig \"%s\"", fTrapConfig->GetTitle())); + // we still have to load the gain tables + // if the gain filter is active + if (HasOnlineFilterGain()) { + const Int_t nDets = AliTRDgeometry::Ndet(); + const Int_t nMcms = AliTRDgeometry::MCMmax(); + const Int_t nChs = AliTRDgeometry::ADCmax(); + + // gain factors are per MCM + // allocate the registers accordingly + for (Int_t ch = 0; ch < nChs; ++ch) { + AliTRDtrapConfig::TrapReg_t regFGAN = (AliTRDtrapConfig::TrapReg_t) (AliTRDtrapConfig::kFGA0 + ch); + AliTRDtrapConfig::TrapReg_t regFGFN = (AliTRDtrapConfig::TrapReg_t) (AliTRDtrapConfig::kFGF0 + ch); + fTrapConfig->SetTrapRegAlloc(regFGAN, AliTRDtrapConfig::kAllocByMCM); + fTrapConfig->SetTrapRegAlloc(regFGFN, AliTRDtrapConfig::kAllocByMCM); + } + + for (Int_t iDet = 0; iDet < nDets; ++iDet) { + AliTRDCalOnlineGainTableROC *gainTbl = GetOnlineGainTableROC(iDet); + if (gainTbl) { + const Int_t nRobs = AliTRDgeometry::GetStack(iDet) == 2 ? + AliTRDgeometry::ROBmaxC0() : AliTRDgeometry::ROBmaxC1(); + for (Int_t rob = 0; rob < nRobs; ++rob) { + for (Int_t mcm = 0; mcm < nMcms; ++mcm) { + AliTRDCalOnlineGainTableMCM *gainTblMCM = gainTbl->GetGainTableMCM(rob, mcm); + + // set ADC reference voltage + fTrapConfig->SetTrapReg(AliTRDtrapConfig::kADCDAC, gainTblMCM->GetAdcdac(), iDet, rob, mcm); + + // set constants channel-wise + for (Int_t ch = 0; ch < nChs; ++ch) { + AliTRDtrapConfig::TrapReg_t regFGAN = (AliTRDtrapConfig::TrapReg_t) (AliTRDtrapConfig::kFGA0 + ch); + AliTRDtrapConfig::TrapReg_t regFGFN = (AliTRDtrapConfig::TrapReg_t) (AliTRDtrapConfig::kFGF0 + ch); + fTrapConfig->SetTrapReg(regFGAN, gainTblMCM->GetFGAN(ch), iDet, rob, mcm); + fTrapConfig->SetTrapReg(regFGFN, gainTblMCM->GetFGFN(ch), iDet, rob, mcm); + } + } + } + } + } + } + return fTrapConfig; } }