#include <TROOT.h>
#include <TClonesArray.h>
#include <TObjArray.h>
#include "AliCDBManager.h"
#include "AliCDBEntry.h"
#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"
#include "Cal/AliTRDCalMonitoring.h"
#include "Cal/AliTRDCalChamberStatus.h"
#include "Cal/AliTRDCalPadStatus.h"
#include "Cal/AliTRDCalSingleChamberStatus.h"
#include "Cal/AliTRDCalTrkAttach.h"
#include "Cal/AliTRDCalOnlineGainTable.h"
ClassImp(AliTRDcalibDB)
AliTRDcalibDB *AliTRDcalibDB::fgInstance = 0;
Bool_t AliTRDcalibDB::fgTerminated = kFALSE;
AliTRDcalibDB* AliTRDcalibDB::Instance()
{
if (fgTerminated != kFALSE) {
return 0;
}
if (fgInstance == 0) {
fgInstance = new AliTRDcalibDB();
}
return fgInstance;
}
void AliTRDcalibDB::Terminate()
{
fgTerminated = kTRUE;
if (fgInstance != 0) {
delete fgInstance;
fgInstance = 0;
}
}
AliTRDcalibDB::AliTRDcalibDB()
:TObject()
,fRun(-1)
,fPRFsmp(0)
,fPRFbin(0)
,fPRFlo(0)
,fPRFhi(0)
,fPRFwid(0)
,fPRFpad(0)
,fPIDResponse(NULL)
,fOnlineGainTableID(0)
,fTrapConfig(0x0)
,fTrapConfigName("")
,fTrapConfigVersion("")
{
for (Int_t i = 0; i < kCDBCacheSize; ++i) {
fCDBCache[i] = 0;
fCDBEntries[i] = 0;
}
SamplePRF();
}
AliTRDcalibDB::AliTRDcalibDB(const AliTRDcalibDB &c)
:TObject(c)
,fRun(-1)
,fPRFsmp(0)
,fPRFbin(0)
,fPRFlo(0)
,fPRFhi(0)
,fPRFwid(0)
,fPRFpad(0)
,fPIDResponse(NULL)
,fOnlineGainTableID(0)
,fTrapConfig(0x0)
,fTrapConfigName("")
,fTrapConfigVersion("")
{
for (Int_t i = 0; i < kCDBCacheSize; ++i) {
fCDBCache[i] = 0;
fCDBEntries[i] = 0;
}
SamplePRF();
}
AliTRDcalibDB &AliTRDcalibDB::operator=(const AliTRDcalibDB &c)
{
if (this != &c) {
AliFatal("No assignment operator defined");
}
return *this;
}
AliTRDcalibDB::~AliTRDcalibDB()
{
if (fPRFsmp) {
delete [] fPRFsmp;
fPRFsmp = 0;
}
if (fPIDResponse) {
delete fPIDResponse;
fPIDResponse = 0x0;
}
Invalidate();
fgInstance = 0;
}
const TObject *AliTRDcalibDB::GetCachedCDBObject(Int_t id)
{
switch (id) {
case kIDVdriftPad :
return CacheCDBEntry(kIDVdriftPad ,"TRD/Calib/LocalVdrift");
break;
case kIDVdriftChamber :
return CacheCDBEntry(kIDVdriftChamber ,"TRD/Calib/ChamberVdrift");
break;
case kIDExBChamber :
return CacheCDBEntry(kIDExBChamber ,"TRD/Calib/ChamberExB");
break;
case kIDT0Pad :
return CacheCDBEntry(kIDT0Pad ,"TRD/Calib/LocalT0");
break;
case kIDT0Chamber :
return CacheCDBEntry(kIDT0Chamber ,"TRD/Calib/ChamberT0");
break;
case kIDGainFactorPad :
return CacheCDBEntry(kIDGainFactorPad ,"TRD/Calib/LocalGainFactor");
break;
case kIDGainFactorChamber :
return CacheCDBEntry(kIDGainFactorChamber ,"TRD/Calib/ChamberGainFactor");
break;
case kIDOnlineGainFactor :
switch(GetOnlineGainTableID()) {
case 0:
AliInfo("No gain table name from OCDB. Use default table!");
return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Krypton_2011-01");
break;
case 1:
return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Krypton_2011-01");
break;
case 2:
return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Gaintbl_Uniform_FGAN0_2011-01");
break;
case 3:
return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Gaintbl_Uniform_FGAN8_2011-01");
break;
case 4:
return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Krypton_2011-02");
break;
case 5:
return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Krypton_2011-03");
break;
case 6:
return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Gaintbl_Uniform_FGAN0_2012-01");
break;
case 7:
return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Gaintbl_Uniform_FGAN8_2012-01");
break;
case 8:
return CacheCDBEntry(kIDOnlineGainFactor ,"TRD/Calib/Krypton_2012-01");
break;
default:
AliError(Form("unknown gaintable requested with ID"));
}
break;
case kIDNoiseChamber :
return CacheCDBEntry(kIDNoiseChamber ,"TRD/Calib/DetNoise");
break;
case kIDNoisePad :
return CacheCDBEntry(kIDNoisePad ,"TRD/Calib/PadNoise");
break;
case kIDPRFWidth :
return CacheCDBEntry(kIDPRFWidth ,"TRD/Calib/PRFWidth");
break;
case kIDChamberStatus :
return CacheCDBEntry(kIDChamberStatus ,"TRD/Calib/ChamberStatus");
break;
case kIDPadStatus :
return CacheCDBEntry(kIDPadStatus ,"TRD/Calib/PadStatus");
break;
case kIDMonitoringData :
return CacheCDBEntry(kIDMonitoringData ,"TRD/Calib/MonitoringData");
break;
case kIDFEE :
return CacheCDBEntry(kIDFEE ,"TRD/Calib/FEE");
break;
case kIDTrapConfig :
return CacheCDBEntry(kIDTrapConfig ,"TRD/Calib/TrapConfig");
break;
case kIDDCS :
return CacheCDBEntry(kIDDCS ,"TRD/Calib/DCS");
break;
case kIDPIDNN :
return CacheCDBEntry(kIDPIDNN ,"TRD/Calib/PIDNN");
break;
case kIDPIDLQ :
return CacheCDBEntry(kIDPIDLQ ,"TRD/Calib/PIDLQ");
break;
case kIDPIDLQ1D:
return CacheCDBEntry(kIDPIDLQ1D ,"TRD/Calib/PIDLQ1D");
break;
case kIDRecoParam :
return CacheCDBEntry(kIDRecoParam ,"TRD/Calib/RecoParam");
break;
case kIDAttach :
return CacheCDBEntry(kIDAttach ,"TRD/Calib/TrkAttach");
break;
case kIDPHQ :
return CacheCDBEntry(kIDPHQ ,"TRD/Calib/PHQ");
break;
}
return 0;
}
AliCDBEntry *AliTRDcalibDB::GetCDBEntry(const char *cdbPath)
{
AliCDBEntry *entry = AliCDBManager::Instance()->Get(cdbPath,fRun);
if (!entry) {
AliError(Form("Failed to get entry: %s",cdbPath));
return 0;
}
return entry;
}
const TObject *AliTRDcalibDB::CacheCDBEntry(Int_t id, const char *cdbPath)
{
if (!fCDBCache[id]) {
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()));
}
}
return fCDBCache[id];
}
void AliTRDcalibDB::SetRun(Long64_t run)
{
if (fRun == run) {
return;
}
fRun = run;
Invalidate();
}
void AliTRDcalibDB::Invalidate()
{
for (Int_t i = 0; i < kCDBCacheSize; ++i) {
if (fCDBEntries[i]) {
if (AliCDBManager::Instance()->GetCacheFlag() == kFALSE) {
if ((fCDBEntries[i]->IsOwner() == kFALSE) &&
(fCDBCache[i])) {
delete fCDBCache[i];
}
delete fCDBEntries[i];
}
fCDBEntries[i] = 0;
fCDBCache[i] = 0;
}
}
fOnlineGainTableID = 0;
}
Float_t AliTRDcalibDB::GetNoise(Int_t det, Int_t col, Int_t row)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDNoisePad));
if (!calPad) {
return -1;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return -1;
}
const AliTRDCalDet *calChamber = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDNoiseChamber));
if (!calChamber) {
return -1;
}
return calChamber->GetValue(det) * roc->GetValue(col,row);
}
AliTRDCalROC *AliTRDcalibDB::GetNoiseROC(Int_t det)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDNoisePad));
if (!calPad) {
return 0;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return 0;
}
else {
return roc;
}
}
const AliTRDCalDet *AliTRDcalibDB::GetNoiseDet()
{
const AliTRDCalDet *calChamber = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDNoiseChamber));
if (!calChamber) {
return 0;
}
else {
return calChamber;
}
}
Float_t AliTRDcalibDB::GetVdrift(Int_t det, Int_t col, Int_t row)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDVdriftPad));
if (!calPad) {
return -1;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return -1;
}
const AliTRDCalDet *calChamber = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDVdriftChamber));
if (!calChamber) {
return -1;
}
return calChamber->GetValue(det) * roc->GetValue(col,row);
}
AliTRDCalROC *AliTRDcalibDB::GetVdriftROC(Int_t det)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDVdriftPad));
if (!calPad) {
return 0;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return 0;
}
else {
return roc;
}
}
const AliTRDCalDet *AliTRDcalibDB::GetVdriftDet()
{
const AliTRDCalDet *calChamber = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDVdriftChamber));
if (!calChamber) {
return 0;
}
else {
return calChamber;
}
}
TObjArray * AliTRDcalibDB::GetPHQ()
{
TObjArray *arr = (TObjArray *) (GetCachedCDBObject(kIDPHQ));
return arr;
}
Float_t AliTRDcalibDB::GetVdriftAverage(Int_t det)
{
const AliTRDCalDet *calDet = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDVdriftChamber));
if (!calDet) {
return -1;
}
return calDet->GetValue(det);
}
const AliTRDCalDet *AliTRDcalibDB::GetExBDet()
{
const AliTRDCalDet *calChamber = dynamic_cast<const AliTRDCalDet *> (GetCachedCDBObject(kIDExBChamber));
Double_t meanexb = 100.0;
if (calChamber) meanexb = calChamber->GetMean();
if ((!calChamber) || (meanexb > 70.0)) {
const AliTRDCalDet *calChambervdrift = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDVdriftChamber));
if (!calChambervdrift) {
return 0;
}
else {
AliTRDCalDet *calDetExB = new AliTRDCalDet("lorentz angle tan","lorentz angle tan (detector value)");
for(Int_t k = 0; k < 540; k++){
calDetExB->SetValue(k,AliTRDCommonParam::Instance()->GetOmegaTau(calChambervdrift->GetValue(k)));
}
return calDetExB;
}
}
else return calChamber;
}
Float_t AliTRDcalibDB::GetT0(Int_t det, Int_t col, Int_t row)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDT0Pad));
if (!calPad) {
return -1;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return -1;
}
const AliTRDCalDet *calChamber = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDT0Chamber));
if (!calChamber) {
return -1;
}
return calChamber->GetValue(det) + roc->GetValue(col,row);
}
AliTRDCalROC *AliTRDcalibDB::GetT0ROC(Int_t det)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDT0Pad));
if (!calPad) {
return 0;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return 0;
}
else {
return roc;
}
}
const AliTRDCalDet *AliTRDcalibDB::GetT0Det()
{
const AliTRDCalDet *calChamber = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDT0Chamber));
if (!calChamber) {
return 0;
}
else {
return calChamber;
}
}
Float_t AliTRDcalibDB::GetT0Average(Int_t det)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDT0Pad));
if (!calPad) {
return -1;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return -1;
}
const AliTRDCalDet *calDet = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDT0Chamber));
if (!calDet) {
return -1;
}
Double_t sum = 0.0;
for (Int_t channel = 0; channel < roc->GetNchannels(); ++channel) {
sum += roc->GetValue(channel);
}
sum /= roc->GetNchannels();
sum += calDet->GetValue(det);
return sum;
}
AliTRDCalOnlineGainTableROC* AliTRDcalibDB::GetOnlineGainTableROC(Int_t det)
{
if (!HasOnlineFilterGain()) {
return 0x0;
}
const AliTRDCalOnlineGainTable *calOnline
= dynamic_cast<const AliTRDCalOnlineGainTable *>
(GetCachedCDBObject(kIDOnlineGainFactor));
if (!calOnline) {
return 0x0;
}
return calOnline->GetGainTableROC(det);
}
Float_t AliTRDcalibDB::GetOnlineGainFactor(Int_t det, Int_t col, Int_t row)
{
if (!HasOnlineFilterGain()) {
return -1;
}
const AliTRDCalOnlineGainTable *calOnline
= dynamic_cast<const AliTRDCalOnlineGainTable *>
(GetCachedCDBObject(kIDOnlineGainFactor));
if (!calOnline) {
return -1;
}
return calOnline->GetGainCorrectionFactor(det,row,col);
}
AliTRDCalROC *AliTRDcalibDB::GetGainFactorROC(Int_t det)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDGainFactorPad));
if (!calPad) {
return 0;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return 0;
}
else {
return roc;
}
}
Float_t AliTRDcalibDB::GetGainFactor(Int_t det, Int_t col, Int_t row)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDGainFactorPad));
if (!calPad) {
return -1;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return -1;
}
const AliTRDCalDet *calChamber = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDGainFactorChamber));
if (!calChamber) {
return -1;
}
return calChamber->GetValue(det) * roc->GetValue(col,row);
}
const AliTRDCalDet *AliTRDcalibDB::GetGainFactorDet()
{
const AliTRDCalDet *calChamber = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDGainFactorChamber));
if (!calChamber) {
return 0;
}
else {
return calChamber;
}
}
Float_t AliTRDcalibDB::GetGainFactorAverage(Int_t det)
{
const AliTRDCalDet *calDet = dynamic_cast<const AliTRDCalDet *>
(GetCachedCDBObject(kIDGainFactorChamber));
if (!calDet) {
return -1;
}
return calDet->GetValue(det);
}
AliTRDCalROC *AliTRDcalibDB::GetPRFROC(Int_t det)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDPRFWidth));
if (!calPad) {
return 0;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return 0;
}
else {
return roc;
}
}
Float_t AliTRDcalibDB::GetPRFWidth(Int_t det, Int_t col, Int_t row)
{
const AliTRDCalPad *calPad = dynamic_cast<const AliTRDCalPad *>
(GetCachedCDBObject(kIDPRFWidth));
if (!calPad) {
return -1;
}
AliTRDCalROC *roc = calPad->GetCalROC(det);
if (!roc) {
return -1;
}
return roc->GetValue(col,row);
}
Int_t AliTRDcalibDB::ExtractTimeBinsFromString(TString tbstr)
{
if (tbstr.Length() == 0) {
AliError("Parameter for number of timebins is empty!");
return -1;
}
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;
}
tbstr.Remove(0,2);
if (!tbstr.IsDigit()) {
AliError(Form("Parameter for number of timebins is corrupted (%s)!", tbstr.Data()));
return -1;
}
return tbstr.Atoi();
}
Int_t AliTRDcalibDB::GetNumberOfTimeBinsDCSBoard(){
Int_t nTB=-1;
const TObjArray *dcsArr = dynamic_cast<const TObjArray *>(GetCachedCDBObject(kIDDCS));
if(!dcsArr)
return -1;
Int_t calver = 0;
if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCS")) calver = 1;
else if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCSv2")) calver = 2;
if (calver == 1) {
AliTRDCalDCS *calSOR = dynamic_cast<AliTRDCalDCS *>(dcsArr->At(0));
if(!calSOR)
return -1;
else
nTB=calSOR->GetGlobalNumberOfTimeBins();
AliTRDCalDCS *calEOR = dynamic_cast<AliTRDCalDCS *>(dcsArr->At(1));
if(calEOR && calEOR->GetGlobalNumberOfTimeBins()!=nTB)
return -2;
}
else if (calver == 2) {
AliTRDCalDCSv2 *calSOR = dynamic_cast<AliTRDCalDCSv2 *>(dcsArr->At(0));
if(!calSOR)
return -1;
else
nTB=calSOR->GetGlobalNumberOfTimeBins();
AliTRDCalDCSv2 *calEOR = dynamic_cast<AliTRDCalDCSv2 *>(dcsArr->At(1));
if(calEOR && calEOR->GetGlobalNumberOfTimeBins()!=nTB)
return -2;
}
else{
return -1;
}
return nTB;
}
Int_t AliTRDcalibDB::GetNumberOfTimeBinsDCS()
{
TString cfg="";
Int_t nTB = -1;
GetGlobalConfigurationByChamber(cfg,kTimebin);
if(cfg.Length()>0){
nTB = ExtractTimeBinsFromString(cfg);
}
if(nTB>0){
return nTB;
}
else{
nTB=GetNumberOfTimeBinsDCSBoard();
if(nTB>0){
AliWarning("Using old method for number of time bins."
" This is probably a patched OCDB entry");
return nTB;
}
else{
AliError("No number of time bins either"
" from config name or patched OCDB entry");
return -1;
}
}
}
void AliTRDcalibDB::GetFilterType(TString &filterType)
{
TString cfgname = "";
GetGlobalConfiguration(cfgname);
GetDCSConfigParOption(cfgname, kFltrSet, 0, filterType);
}
Int_t AliTRDcalibDB::GetOnlineGainTableID()
{
if (fOnlineGainTableID > 0) {
return fOnlineGainTableID;
}
const TObjArray *dcsArr = dynamic_cast<const TObjArray *>(GetCachedCDBObject(kIDDCS));
if (!dcsArr){
return -1;
}
Int_t esor = 0;
Int_t calver = 0;
if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCS")) calver = 1;
if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCSv2")) calver = 2;
if (calver == 1) {
return -1;
}
else if (calver == 2) {
const AliTRDCalDCSv2 *calDCSv2 = dynamic_cast<const AliTRDCalDCSv2 *>(dcsArr->At(esor));
if(!calDCSv2){
return -1;
}
TString tableName = "";
for (Int_t i = 0; i < 540; i++) {
const AliTRDCalDCSFEEv2 *calDCSFEEv2 = calDCSv2->GetCalDCSFEEObj(0);
tableName = calDCSFEEv2->GetGainTableName();
if (tableName.Length() > 0) {
break;
}
}
if (tableName.CompareTo("Krypton_2011-01") == 0)
fOnlineGainTableID = 1;
else if (tableName.CompareTo("Gaintbl_Uniform_FGAN0_2011-01") == 0)
fOnlineGainTableID = 2;
else if (tableName.CompareTo("Gaintbl_Uniform_FGAN8_2011-01") == 0)
fOnlineGainTableID = 3;
else if (tableName.CompareTo("Krypton_2011-02") == 0)
fOnlineGainTableID = 4;
else if (tableName.CompareTo("Krypton_2011-03") == 0)
fOnlineGainTableID = 5;
else if (tableName.CompareTo("Gaintbl_Uniform_FGAN0_2012-01") == 0)
fOnlineGainTableID = 6;
else if (tableName.CompareTo("Gaintbl_Uniform_FGAN8_2012-01") == 0)
fOnlineGainTableID = 7;
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 {
AliError("NO DCS/DCSv2 OCDB entry found!");
return -1;
}
return -1;
}
void AliTRDcalibDB::GetGlobalConfiguration(TString &config)
{
const TObjArray *dcsArr = dynamic_cast<const TObjArray *>(GetCachedCDBObject(kIDDCS));
if(!dcsArr){
AliError("No DCS CDB Object available!");
config = "";
return;
}
Int_t idSOR = 0, idEOR=1;
Bool_t hasSOR = (dcsArr->At(idSOR));
Bool_t hasEOR = (dcsArr->At(idEOR));
TString cfgSOR = "", cfgEOR = "";
if (!hasSOR) {
AliError("NO SOR object found in CDB file!");
config = "";
return;
}
if (!hasEOR) AliWarning("NO EOR object found in CDB file!");
Int_t calver = 0;
if (!strcmp(dcsArr->At(idSOR)->ClassName(),"AliTRDCalDCS")) calver = 1;
else if (!strcmp(dcsArr->At(idSOR)->ClassName(),"AliTRDCalDCSv2")) calver = 2;
if (calver == 1) {
const AliTRDCalDCS *calSOR = dynamic_cast<const AliTRDCalDCS *>(dcsArr->At(idSOR));
cfgSOR = calSOR->GetGlobalConfigName();
if (hasEOR) {
const AliTRDCalDCS *calEOR = dynamic_cast<const AliTRDCalDCS *>(dcsArr->At(idEOR));
cfgEOR = calEOR->GetGlobalConfigName();
}
}
else if (calver == 2) {
const AliTRDCalDCSv2 *calv2SOR = dynamic_cast<const AliTRDCalDCSv2 *>(dcsArr->At(idSOR));
cfgSOR = calv2SOR->GetGlobalConfigName();
if (hasEOR) {
const AliTRDCalDCSv2 *calv2EOR = dynamic_cast<const AliTRDCalDCSv2 *>(dcsArr->At(idEOR));
cfgEOR = calv2EOR->GetGlobalConfigName();
}
}
else {
AliError("NO DCS/DCSv2 OCDB entry found!");
config = "";
return;
}
if (!hasEOR || cfgEOR.Length()==0) {
config = cfgSOR;
return;
}
if (cfgSOR.EqualTo(cfgEOR)) {
config = cfgSOR;
return;
}
AliError("Inconsistent configuration at start and end of run found!");
config = "";
return;
}
void AliTRDcalibDB::GetGlobalConfigurationByChamber(TString &config,Int_t par, Int_t opt)
{
const TObjArray *dcsArr = dynamic_cast<const TObjArray *>(GetCachedCDBObject(kIDDCS));
if(!dcsArr){
AliError("No DCS CDB Object available!");
config = "";
return;
}
Int_t calver = 0;
if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCS")) calver = 1;
else if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCSv2")) calver = 2;
if (calver == 1) {
for(Int_t iSEOR=0;iSEOR<2;iSEOR++){
AliTRDCalDCS *cal = dynamic_cast<AliTRDCalDCS *>(dcsArr->At(iSEOR));
if(!cal){
if(iSEOR==0){
AliError("NO SOR object found in CDB file!");
config = "";
return;
}
else{
AliWarning("NO EOR object found in CDB file!");
continue;
}
}
{
Int_t iDet=0;
if(iSEOR==0){
for(;iDet<kNdet;iDet++){
const AliTRDCalDCSFEE *DCSFEEObj = cal->GetCalDCSFEEObj(iDet);
if(DCSFEEObj && !DCSFEEObj->GetStatusBit()) {
if(DCSFEEObj->GetConfigName().BeginsWith("cf_")){
GetDCSConfigParOption(DCSFEEObj->GetConfigName(), par, opt, config);
iDet++;
break;
}
}
}
}
for(;iDet<kNdet;iDet++){
const AliTRDCalDCSFEE *DCSFEEObj = cal->GetCalDCSFEEObj(iDet);
if(DCSFEEObj && !DCSFEEObj->GetStatusBit()) {
if(DCSFEEObj->GetConfigName().BeginsWith("cf_")){
TString tmpcfg;
GetDCSConfigParOption(DCSFEEObj->GetConfigName(), par, opt, tmpcfg);
if(config.CompareTo(tmpcfg)){
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;
}
}
}
}
}
}
}
}
else if (calver == 2) {
for(Int_t iSEOR=0;iSEOR<2;iSEOR++){
AliTRDCalDCSv2 *cal = dynamic_cast<AliTRDCalDCSv2 *>(dcsArr->At(iSEOR));
if(!cal){
if(iSEOR==0){
AliError("NO SOR object found in CDB file!");
config = "";
return;
}
else{
AliWarning("NO EOR object found in CDB file!");
continue;
}
}
{
Int_t iDet=0;
if(iSEOR==0){
for(;iDet<kNdet;iDet++){
const AliTRDCalDCSFEEv2 *DCSFEEObj = cal->GetCalDCSFEEObj(iDet);
if(DCSFEEObj && !DCSFEEObj->GetStatusBit()) {
if(DCSFEEObj->GetConfigName().BeginsWith("cf_")){
GetDCSConfigParOption(DCSFEEObj->GetConfigName(), par, opt, config);
iDet++;
break;
}
}
}
}
for(;iDet<kNdet;iDet++){
const AliTRDCalDCSFEEv2 *DCSFEEObj = cal->GetCalDCSFEEObj(iDet);
if(DCSFEEObj && !DCSFEEObj->GetStatusBit()) {
if(DCSFEEObj->GetConfigName().BeginsWith("cf_")){
TString tmpcfg;
GetDCSConfigParOption(DCSFEEObj->GetConfigName(), par, opt, tmpcfg);
if(config.CompareTo(tmpcfg)){
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;
}
}
}
}
}
}
}
}
else {
AliError("NO DCS/DCSv2 OCDB entry found!");
config = "";
return;
}
}
void AliTRDcalibDB::GetGlobalConfigurationVersion(TString &version)
{
const TObjArray *dcsArr = dynamic_cast<const TObjArray *>(GetCachedCDBObject(kIDDCS));
if(!dcsArr){
version = "";
return;
}
Int_t esor = 0;
Int_t calver = 0;
if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCS")) calver = 1;
if (!strcmp(dcsArr->At(0)->ClassName(),"AliTRDCalDCSv2")) calver = 2;
if (calver == 1) {
const AliTRDCalDCS *calDCS = dynamic_cast<const AliTRDCalDCS *>(dcsArr->At(esor));
if(!calDCS){
version = "";
return;
}
version = calDCS->GetGlobalConfigVersion();
}
else if (calver == 2) {
const AliTRDCalDCSv2 *calDCSv2 = dynamic_cast<const AliTRDCalDCSv2 *>(dcsArr->At(esor));
if(!calDCSv2){
version = "";
return;
}
version = calDCSv2->GetGlobalConfigVersion();
}
else {
AliError("NO DCS/DCSv2 OCDB entry found!");
}
}
Int_t AliTRDcalibDB::GetNumberOfParsDCS(TString cname, Char_t delimiter)
{
if(!cname.Length()) return -1;
Int_t nconf(0);
for(Int_t ich(1); ich<cname.Length()-1; ich++){ if(cname[ich]==delimiter) nconf++;}
return nconf;
}
Int_t AliTRDcalibDB::GetNumberOfOptsDCS(TString cname, Int_t cfgType)
{
Char_t cdelim = '_',
odelim = '-';
Int_t nconfig = GetNumberOfParsDCS(cname, cdelim);
if ((nconfig == -1) || (nconfig < cfgType)) {
AliError("Not enough parameters in DCS configuration name!");
return 0;
}
TObjArray *carr = cname.Tokenize(cdelim);
Int_t nopt = GetNumberOfParsDCS(((TObjString*)carr->At(cfgType))->GetString(), odelim);
carr->Delete(); delete carr;
return nopt;
}
void AliTRDcalibDB::GetDCSConfigParOption(TString cname, Int_t cfgType, Int_t option, TString &cfgo)
{
Char_t cdelim = '_',
odelim = '-';
Int_t nconfig = GetNumberOfParsDCS(cname, cdelim);
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);
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;
}
Bool_t AliTRDcalibDB::HasOnlineFilterPedestal()
{
TString filterconfig;
GetFilterType(filterconfig);
return filterconfig.Contains("p");
}
Bool_t AliTRDcalibDB::HasOnlineFilterGain()
{
TString filterconfig;
GetFilterType(filterconfig);
return filterconfig.Contains("g");
}
Bool_t AliTRDcalibDB::HasOnlineTailCancellation()
{
TString filterconfig;
GetFilterType(filterconfig);
return filterconfig.Contains("t");
}
Char_t AliTRDcalibDB::GetPadStatus(Int_t det, Int_t col, Int_t row)
{
const AliTRDCalPadStatus *cal = dynamic_cast<const AliTRDCalPadStatus *>
(GetCachedCDBObject(kIDPadStatus));
if (!cal) {
return -1;
}
const AliTRDCalSingleChamberStatus *roc = cal->GetCalROC(det);
if (!roc) {
return -1;
}
return roc->GetStatus(col,row);
}
AliTRDCalSingleChamberStatus* AliTRDcalibDB::GetPadStatusROC(Int_t det)
{
const AliTRDCalPadStatus *cal = dynamic_cast<const AliTRDCalPadStatus *>
(GetCachedCDBObject(kIDPadStatus));
if (!cal) {
return 0;
}
AliTRDCalSingleChamberStatus *roc = cal->GetCalROC(det);
if (!roc) {
return 0;
}
else {
return roc;
}
}
Char_t AliTRDcalibDB::GetChamberStatus(Int_t det)
{
const AliTRDCalChamberStatus *cal = dynamic_cast<const AliTRDCalChamberStatus *>
(GetCachedCDBObject(kIDChamberStatus));
if (!cal) {
return -1;
}
return cal->GetStatus(det);
}
AliTRDrecoParam* AliTRDcalibDB::GetRecoParam(Int_t *)
{
const TClonesArray *recos = dynamic_cast<const TClonesArray*>(GetCachedCDBObject(kIDRecoParam));
if (!recos) return 0x0;
Int_t n = 0;
return (AliTRDrecoParam *) recos->UncheckedAt(n);
}
Bool_t AliTRDcalibDB::IsPadMasked(Int_t det, Int_t col, Int_t row)
{
const AliTRDCalPadStatus *cal = dynamic_cast<const AliTRDCalPadStatus *>
(GetCachedCDBObject(kIDPadStatus));
if (!cal) {
return -1;
}
return cal->IsMasked(det,col,row);
}
Bool_t AliTRDcalibDB::IsPadBridgedLeft(Int_t det, Int_t col, Int_t row)
{
const AliTRDCalPadStatus *cal = dynamic_cast<const AliTRDCalPadStatus *>
(GetCachedCDBObject(kIDPadStatus));
if (!cal) {
return -1;
}
return cal->IsBridgedLeft(det,col,row);
}
Bool_t AliTRDcalibDB::IsPadBridgedRight(Int_t det, Int_t col, Int_t row)
{
const AliTRDCalPadStatus * cal = dynamic_cast<const AliTRDCalPadStatus *>
(GetCachedCDBObject(kIDPadStatus));
if (!cal) {
return -1;
}
return cal->IsBridgedRight(det,col,row);
}
Bool_t AliTRDcalibDB::IsPadNotConnected(Int_t det, Int_t col, Int_t row)
{
const AliTRDCalPadStatus * cal = dynamic_cast<const AliTRDCalPadStatus *>
(GetCachedCDBObject(kIDPadStatus));
if (!cal) {
return -1;
}
return cal->IsNotConnected(det,col,row);
}
Bool_t AliTRDcalibDB::IsChamberGood(Int_t det)
{
const AliTRDCalChamberStatus * cal = dynamic_cast<const AliTRDCalChamberStatus *>
(GetCachedCDBObject(kIDChamberStatus));
if (!cal) {
return -1;
}
return cal->IsGood(det);
}
Bool_t AliTRDcalibDB::IsChamberNoData(Int_t det)
{
const AliTRDCalChamberStatus * cal = dynamic_cast<const AliTRDCalChamberStatus *>
(GetCachedCDBObject(kIDChamberStatus));
if (!cal) {
return -1;
}
return cal->IsNoData(det);
}
Bool_t AliTRDcalibDB::IsHalfChamberNoData(Int_t det, Int_t side)
{
const AliTRDCalChamberStatus * cal = dynamic_cast<const AliTRDCalChamberStatus *>
(GetCachedCDBObject(kIDChamberStatus));
if (!cal) {
return -1;
}
return side > 0 ? cal->IsNoDataSideB(det) : cal->IsNoDataSideA(det);
}
Bool_t AliTRDcalibDB::IsChamberBadCalibrated(Int_t det)
{
const AliTRDCalChamberStatus * cal = dynamic_cast<const AliTRDCalChamberStatus *>
(GetCachedCDBObject(kIDChamberStatus));
if (!cal) {
return -1;
}
return cal->IsBadCalibrated(det);
}
Bool_t AliTRDcalibDB::IsChamberNotCalibrated(Int_t det)
{
const AliTRDCalChamberStatus * cal = dynamic_cast<const AliTRDCalChamberStatus *>
(GetCachedCDBObject(kIDChamberStatus));
if (!cal) {
return -1;
}
return cal->IsNotCalibrated(det);
}
const AliTRDCalPID *AliTRDcalibDB::GetPIDObject(AliTRDpidUtil::ETRDPIDMethod method)
{
switch(method) {
case AliTRDpidUtil::kLQ:
return dynamic_cast<const AliTRDCalPID *>(GetCachedCDBObject(kIDPIDLQ));
case AliTRDpidUtil::kNN:
return dynamic_cast<const AliTRDCalPID *>(GetCachedCDBObject(kIDPIDNN));
case AliTRDpidUtil::kESD:
return 0x0;
}
return 0x0;
}
AliTRDPIDResponse *AliTRDcalibDB::GetPIDResponse(AliTRDPIDResponse::ETRDPIDMethod )
{
if (!fPIDResponse) {
AliDebug(2, "Setting new PID response.");
fPIDResponse = new AliTRDPIDResponse;
const TObjArray *references = dynamic_cast<const TObjArray *>(GetCachedCDBObject(kIDPIDLQ1D));
TIter refs(references);
TObject *obj = NULL;
AliTRDPIDReference *ref = NULL;
Bool_t hasReference = kFALSE;
while ((obj = refs())){
if ((ref = dynamic_cast<AliTRDPIDReference *>(obj))){
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;
}
}
if (!hasReference) {
AliError("Reference histograms not found in the OCDB");
}
}
return fPIDResponse;
}
const AliTRDCalTrkAttach* AliTRDcalibDB::GetAttachObject()
{
return dynamic_cast<const AliTRDCalTrkAttach*>(GetCachedCDBObject(kIDAttach));
}
const AliTRDCalMonitoring *AliTRDcalibDB::GetMonitoringObject()
{
return dynamic_cast<const AliTRDCalMonitoring *>
(GetCachedCDBObject(kIDMonitoringData));
}
void AliTRDcalibDB::SamplePRF()
{
const Int_t kPRFbin = 61;
Float_t prf[kNlayer][kPRFbin] = {
{2.9037e-02, 3.3608e-02, 3.9020e-02, 4.5292e-02,
5.2694e-02, 6.1362e-02, 7.1461e-02, 8.3362e-02,
9.7063e-02, 1.1307e-01, 1.3140e-01, 1.5235e-01,
1.7623e-01, 2.0290e-01, 2.3294e-01, 2.6586e-01,
3.0177e-01, 3.4028e-01, 3.8077e-01, 4.2267e-01,
4.6493e-01, 5.0657e-01, 5.4655e-01, 5.8397e-01,
6.1767e-01, 6.4744e-01, 6.7212e-01, 6.9188e-01,
7.0627e-01, 7.1499e-01, 7.1851e-01, 7.1499e-01,
7.0627e-01, 6.9188e-01, 6.7212e-01, 6.4744e-01,
6.1767e-01, 5.8397e-01, 5.4655e-01, 5.0657e-01,
4.6493e-01, 4.2267e-01, 3.8077e-01, 3.4028e-01,
3.0177e-01, 2.6586e-01, 2.3294e-01, 2.0290e-01,
1.7623e-01, 1.5235e-01, 1.3140e-01, 1.1307e-01,
9.7063e-02, 8.3362e-02, 7.1461e-02, 6.1362e-02,
5.2694e-02, 4.5292e-02, 3.9020e-02, 3.3608e-02,
2.9037e-02},
{2.5478e-02, 2.9695e-02, 3.4655e-02, 4.0454e-02,
4.7342e-02, 5.5487e-02, 6.5038e-02, 7.6378e-02,
8.9696e-02, 1.0516e-01, 1.2327e-01, 1.4415e-01,
1.6794e-01, 1.9516e-01, 2.2573e-01, 2.5959e-01,
2.9694e-01, 3.3719e-01, 3.7978e-01, 4.2407e-01,
4.6889e-01, 5.1322e-01, 5.5569e-01, 5.9535e-01,
6.3141e-01, 6.6259e-01, 6.8882e-01, 7.0983e-01,
7.2471e-01, 7.3398e-01, 7.3761e-01, 7.3398e-01,
7.2471e-01, 7.0983e-01, 6.8882e-01, 6.6259e-01,
6.3141e-01, 5.9535e-01, 5.5569e-01, 5.1322e-01,
4.6889e-01, 4.2407e-01, 3.7978e-01, 3.3719e-01,
2.9694e-01, 2.5959e-01, 2.2573e-01, 1.9516e-01,
1.6794e-01, 1.4415e-01, 1.2327e-01, 1.0516e-01,
8.9696e-02, 7.6378e-02, 6.5038e-02, 5.5487e-02,
4.7342e-02, 4.0454e-02, 3.4655e-02, 2.9695e-02,
2.5478e-02},
{2.2363e-02, 2.6233e-02, 3.0782e-02, 3.6140e-02,
4.2535e-02, 5.0157e-02, 5.9197e-02, 6.9900e-02,
8.2707e-02, 9.7811e-02, 1.1548e-01, 1.3601e-01,
1.5998e-01, 1.8739e-01, 2.1840e-01, 2.5318e-01,
2.9182e-01, 3.3373e-01, 3.7837e-01, 4.2498e-01,
4.7235e-01, 5.1918e-01, 5.6426e-01, 6.0621e-01,
6.4399e-01, 6.7700e-01, 7.0472e-01, 7.2637e-01,
7.4206e-01, 7.5179e-01, 7.5551e-01, 7.5179e-01,
7.4206e-01, 7.2637e-01, 7.0472e-01, 6.7700e-01,
6.4399e-01, 6.0621e-01, 5.6426e-01, 5.1918e-01,
4.7235e-01, 4.2498e-01, 3.7837e-01, 3.3373e-01,
2.9182e-01, 2.5318e-01, 2.1840e-01, 1.8739e-01,
1.5998e-01, 1.3601e-01, 1.1548e-01, 9.7811e-02,
8.2707e-02, 6.9900e-02, 5.9197e-02, 5.0157e-02,
4.2535e-02, 3.6140e-02, 3.0782e-02, 2.6233e-02,
2.2363e-02},
{1.9635e-02, 2.3167e-02, 2.7343e-02, 3.2293e-02,
3.8224e-02, 4.5335e-02, 5.3849e-02, 6.4039e-02,
7.6210e-02, 9.0739e-02, 1.0805e-01, 1.2841e-01,
1.5216e-01, 1.7960e-01, 2.1099e-01, 2.4671e-01,
2.8647e-01, 3.2996e-01, 3.7660e-01, 4.2547e-01,
4.7536e-01, 5.2473e-01, 5.7215e-01, 6.1632e-01,
6.5616e-01, 6.9075e-01, 7.1939e-01, 7.4199e-01,
7.5838e-01, 7.6848e-01, 7.7227e-01, 7.6848e-01,
7.5838e-01, 7.4199e-01, 7.1939e-01, 6.9075e-01,
6.5616e-01, 6.1632e-01, 5.7215e-01, 5.2473e-01,
4.7536e-01, 4.2547e-01, 3.7660e-01, 3.2996e-01,
2.8647e-01, 2.4671e-01, 2.1099e-01, 1.7960e-01,
1.5216e-01, 1.2841e-01, 1.0805e-01, 9.0739e-02,
7.6210e-02, 6.4039e-02, 5.3849e-02, 4.5335e-02,
3.8224e-02, 3.2293e-02, 2.7343e-02, 2.3167e-02,
1.9635e-02},
{1.7224e-02, 2.0450e-02, 2.4286e-02, 2.8860e-02,
3.4357e-02, 4.0979e-02, 4.8966e-02, 5.8612e-02,
7.0253e-02, 8.4257e-02, 1.0102e-01, 1.2094e-01,
1.4442e-01, 1.7196e-01, 2.0381e-01, 2.4013e-01,
2.8093e-01, 3.2594e-01, 3.7450e-01, 4.2563e-01,
4.7796e-01, 5.2991e-01, 5.7974e-01, 6.2599e-01,
6.6750e-01, 7.0344e-01, 7.3329e-01, 7.5676e-01,
7.7371e-01, 7.8410e-01, 7.8793e-01, 7.8410e-01,
7.7371e-01, 7.5676e-01, 7.3329e-01, 7.0344e-01,
6.6750e-01, 6.2599e-01, 5.7974e-01, 5.2991e-01,
4.7796e-01, 4.2563e-01, 3.7450e-01, 3.2594e-01,
2.8093e-01, 2.4013e-01, 2.0381e-01, 1.7196e-01,
1.4442e-01, 1.2094e-01, 1.0102e-01, 8.4257e-02,
7.0253e-02, 5.8612e-02, 4.8966e-02, 4.0979e-02,
3.4357e-02, 2.8860e-02, 2.4286e-02, 2.0450e-02,
1.7224e-02},
{1.5096e-02, 1.8041e-02, 2.1566e-02, 2.5793e-02,
3.0886e-02, 3.7044e-02, 4.4515e-02, 5.3604e-02,
6.4668e-02, 7.8109e-02, 9.4364e-02, 1.1389e-01,
1.3716e-01, 1.6461e-01, 1.9663e-01, 2.3350e-01,
2.7527e-01, 3.2170e-01, 3.7214e-01, 4.2549e-01,
4.8024e-01, 5.3460e-01, 5.8677e-01, 6.3512e-01,
6.7838e-01, 7.1569e-01, 7.4655e-01, 7.7071e-01,
7.8810e-01, 7.9871e-01, 8.0255e-01, 7.9871e-01,
7.8810e-01, 7.7071e-01, 7.4655e-01, 7.1569e-01,
6.7838e-01, 6.3512e-01, 5.8677e-01, 5.3460e-01,
4.8024e-01, 4.2549e-01, 3.7214e-01, 3.2170e-01,
2.7527e-01, 2.3350e-01, 1.9663e-01, 1.6461e-01,
1.3716e-01, 1.1389e-01, 9.4364e-02, 7.8109e-02,
6.4668e-02, 5.3604e-02, 4.4515e-02, 3.7044e-02,
3.0886e-02, 2.5793e-02, 2.1566e-02, 1.8041e-02,
1.5096e-02}};
fPRFlo = -1.5;
fPRFhi = 1.5;
Float_t pad[kPRFbin];
Int_t sPRFbin = kPRFbin;
Float_t sPRFwid = (fPRFhi - fPRFlo) / ((Float_t) sPRFbin);
for (Int_t iPad = 0; iPad < sPRFbin; iPad++) {
pad[iPad] = ((Float_t) iPad + 0.5) * sPRFwid + fPRFlo;
}
fPRFbin = 500;
fPRFwid = (fPRFhi - fPRFlo) / ((Float_t) fPRFbin);
fPRFpad = ((Int_t) (1.0 / fPRFwid));
if (fPRFsmp) delete [] fPRFsmp;
fPRFsmp = new Float_t[kNlayer*fPRFbin];
Int_t ipos1;
Int_t ipos2;
Float_t diff;
for (Int_t iLayer = 0; iLayer < kNlayer; iLayer++) {
for (Int_t iBin = 0; iBin < fPRFbin; iBin++) {
Float_t bin = (((Float_t) iBin) + 0.5) * fPRFwid + fPRFlo;
ipos1 = ipos2 = 0;
diff = 0;
do {
diff = bin - pad[ipos2++];
} while ((diff > 0) && (ipos2 < kPRFbin));
if (ipos2 == kPRFbin) {
fPRFsmp[iLayer*fPRFbin+iBin] = prf[iLayer][ipos2-1];
}
else if (ipos2 == 1) {
fPRFsmp[iLayer*fPRFbin+iBin] = prf[iLayer][ipos2-1];
}
else {
ipos2--;
if (ipos2 >= kPRFbin) ipos2 = kPRFbin - 1;
ipos1 = ipos2 - 1;
fPRFsmp[iLayer*fPRFbin+iBin] = prf[iLayer][ipos2]
+ diff * (prf[iLayer][ipos2] - prf[iLayer][ipos1])
/ sPRFwid;
}
}
}
}
Int_t AliTRDcalibDB::PadResponse(Double_t signal, Double_t dist
, Int_t layer, Double_t *pad) const
{
Int_t iBin = ((Int_t) ((-dist - fPRFlo) / fPRFwid));
Int_t iOff = layer * fPRFbin;
Int_t iBin0 = iBin - fPRFpad + iOff;
Int_t iBin1 = iBin + iOff;
Int_t iBin2 = iBin + fPRFpad + iOff;
pad[0] = 0.0;
pad[1] = 0.0;
pad[2] = 0.0;
if ((iBin1 >= 0) && (iBin1 < (fPRFbin*kNlayer))) {
if (iBin0 >= 0) {
pad[0] = signal * fPRFsmp[iBin0];
}
pad[1] = signal * fPRFsmp[iBin1];
if (iBin2 < (fPRFbin*kNlayer)) {
pad[2] = signal * fPRFsmp[iBin2];
}
return 1;
}
else {
return 0;
}
}
AliTRDtrapConfig* AliTRDcalibDB::GetTrapConfig()
{
if (fTrapConfig)
return fTrapConfig;
else {
if ((fTrapConfigName.Length() <= 0) || (fTrapConfigVersion.Length() <= 0)) {
this->GetGlobalConfiguration(fTrapConfigName);
this->GetGlobalConfigurationVersion(fTrapConfigVersion);
}
this->LoadTrapConfig(fTrapConfigName, fTrapConfigVersion);
if (!fTrapConfig) {
AliWarning("Falling back to default configuration");
static AliTRDtrapConfig trapConfigDefault("default", "default TRAP configuration");
fTrapConfig = &trapConfigDefault;
AliTRDtrapConfigHandler cfgHandler(fTrapConfig);
cfgHandler.Init();
cfgHandler.LoadConfig();
}
AliInfo(Form("using TRAPconfig \"%s\"", fTrapConfig->GetTitle()));
if (HasOnlineFilterGain()) {
const Int_t nDets = AliTRDgeometry::Ndet();
const Int_t nMcms = AliTRDgeometry::MCMmax();
const Int_t nChs = AliTRDgeometry::ADCmax();
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);
fTrapConfig->SetTrapReg(AliTRDtrapConfig::kADCDAC, gainTblMCM->GetAdcdac(), iDet, rob, mcm);
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;
}
}
AliTRDtrapConfig* AliTRDcalibDB::LoadTrapConfig(const TString &name, const TString &version)
{
AliInfo(Form("looking for TRAPconfig \"%s.%s\"", name.Data(), version.Data()));
const AliTRDCalTrapConfig *caltrap = dynamic_cast<const AliTRDCalTrapConfig*> (GetCachedCDBObject(kIDTrapConfig));
if (caltrap) {
TString configName(name);
configName.Append(".");
configName.Append(version);
fTrapConfig = caltrap->Get(configName);
}
else {
fTrapConfig = 0x0;
AliError("No TRAPconfig entry found!");
}
return fTrapConfig;
}