//
// Singleton implementation
// Returns an instance of this class, it is created if neccessary
- //
+ //
if (fgTerminated != kFALSE)
return 0;
Invalidate();
}
+//_caching functions____________________________________________________________
+const TObject* AliTRDcalibDB::GetCachedCDBObject(Int_t id)
+{
+ //
+ // Retrieves a cdb object with the given id. The objects are cached as long as the run number is not changed.
+ //
+ // Put together the available objects here by using the lines
+ // a) For usual calibration objects:
+ // ase kID<Name> : return CacheCDBEntry(kID<Name>, "TRD/Calib/<Path>"); break;
+ // See function CacheCDBEntry for details.
+ // and
+ // b) For calibration data which depends on two objects: One containing a value per detector and one the local fluctuations per pad:
+ // case kID<Name> : return CacheMergeCDBEntry(kID<Name>, "TRD/Calib/<padPath>", "TRD/Calib/<chamberPath>"); break;
+ // See function CacheMergeCDBEntry for details.
+ //
+
+ switch (id)
+ {
+ // parameters defined per pad and chamber
+ case kIDVdrift : return CacheMergeCDBEntry(kIDVdrift, "TRD/Calib/LocalVdrift", "TRD/Calib/ChamberVdrift"); break;
+ case kIDT0 : return CacheMergeCDBEntry(kIDT0, "TRD/Calib/LocalT0", "TRD/Calib/ChamberT0"); break;
+
+ // parameters defined per pad
+ case kIDGainFactor : return CacheCDBEntry(kIDGainFactor, "TRD/Calib/GainFactor"); break;
+ case kIDPRFWidth : return CacheCDBEntry(kIDPRFWidth, "TRD/Calib/PRFWidth"); break;
+
+ // global parameters
+ case kIDGlobals : return CacheCDBEntry(kIDGlobals, "TRD/Calib/Globals"); break;
+ case kIDChamber : return CacheCDBEntry(kIDChamber, "TRD/Calib/Chamber"); break;
+ case kIDStack : return CacheCDBEntry(kIDStack, "TRD/Calib/Stack"); break;
+ case kIDPIDLQ : return CacheCDBEntry(kIDPIDLQ, "TRD/Calib/PIDLQ"); break;
+ }
+ return 0;
+}
+
+//_____________________________________________________________________________
+AliCDBEntry* AliTRDcalibDB::GetCDBEntry(const char* cdbPath)
+{
+ //
+ // Retrieves an entry with path <cdbPath> from the CDB.
+ //
+
+ if (fRun < 0)
+ {
+ AliFatal("AliTRDcalibDB: Run number not set! Use AliTRDcalibDB::SetRun.");
+ //std::cerr << "AliTRDcalibDB: Run number not set! Use AliTRDcalibDB::SetRun." << std::endl;
+ return 0;
+ }
+ if (!fLocator)
+ {
+ std::cerr << "AliTRDcalibDB: Storage Locator not available." << std::endl;
+ return 0;
+ }
+ AliCDBEntry* entry = fLocator->Get(cdbPath, fRun);
+ if (!entry)
+ {
+ std::cerr << "AliTRDcalibDB: Failed to get entry: " << cdbPath << std::endl;
+ return 0;
+ }
+
+ std::cout << "AliTRDcalibDB: Retrieved object: " << cdbPath << std::endl;
+ return entry;
+}
+
+//_____________________________________________________________________________
+const TObject* AliTRDcalibDB::CacheCDBEntry(Int_t id, const char* cdbPath)
+{
+ //
+ // Caches the entry <id> with cdb path <cdbPath>
+ //
+
+ if (!fCDBCache[id])
+ {
+ fCDBEntries[id] = GetCDBEntry(cdbPath);
+ if (fCDBEntries[id])
+ fCDBCache[id] = fCDBEntries[id]->GetObject();
+ }
+ return fCDBCache[id];
+}
+
+//_____________________________________________________________________________
+const TObject* AliTRDcalibDB::CacheMergeCDBEntry(Int_t id, const char* cdbPadPath, const char* cdbChamberPath)
+{
+ //
+ // Retrieves and caches an object (id <id>) from the CDB. This function is specialized for parameters which are stored
+ // as local variation at pad level of a global variable defined per detector chamber. It uses the classes AliTRDCalPad and AliTRDCalDet.
+ // Before storing the object it retrieves the local variations (cdbPadPath) and the global variable (cdbChamberPath) and merges them using
+ // the AliTRDCalPad::ScaleROCs.
+ //
+
+ if (!fCDBCache[id])
+ {
+ AliTRDCalPad* padObject = 0;
+ AliTRDCalDet* detObject = 0;
+
+ fCDBEntries[id] = GetCDBEntry(cdbPadPath);
+ if (fCDBEntries[id])
+ padObject = dynamic_cast<AliTRDCalPad*>(fCDBEntries[id]->GetObject());
+
+ AliCDBEntry* mergeEntry = GetCDBEntry(cdbChamberPath);
+ if (mergeEntry)
+ detObject = dynamic_cast<AliTRDCalDet*>(mergeEntry->GetObject());
+
+ if (!padObject || !detObject)
+ {
+ if (fCDBEntries[id]) {
+ if (fCDBEntries[id]->IsOwner() == kFALSE && padObject)
+ delete padObject;
+ delete fCDBEntries[id];
+ fCDBEntries[id] = 0;
+ }
+ if (mergeEntry)
+ {
+ if (mergeEntry->IsOwner() == kFALSE && detObject)
+ delete detObject;
+ delete mergeEntry;
+ }
+ return 0;
+ }
+
+ padObject->ScaleROCs(detObject);
+ if (mergeEntry->IsOwner() == kFALSE)
+ delete detObject;
+ delete mergeEntry;
+
+ fCDBCache[id] = padObject;
+ }
+
+ return fCDBCache[id];
+}
+
//_____________________________________________________________________________
void AliTRDcalibDB::SetRun(Long64_t run)
{
// Returns the deviation of the chamber position from the nominal position.
//
- AliTRDCalChamberPos* chamber = dynamic_cast<AliTRDCalChamberPos*>(GetCachedCDBObject(kIDChamber));
+ const AliTRDCalChamberPos* chamber = dynamic_cast<const AliTRDCalChamberPos*>(GetCachedCDBObject(kIDChamber));
if (!chamber)
return kFALSE;
// Returns the rotation of the chamber from the nominal position.
//
- AliTRDCalChamberPos* chamber = dynamic_cast<AliTRDCalChamberPos*>(GetCachedCDBObject(kIDChamber));
+ const AliTRDCalChamberPos* chamber = dynamic_cast<const AliTRDCalChamberPos*>(GetCachedCDBObject(kIDChamber));
if (!chamber)
return kFALSE;
// Returns the deviation of the stack position from the nominal position.
//
- AliTRDCalStackPos* stack = dynamic_cast<AliTRDCalStackPos*>(GetCachedCDBObject(kIDStack));
+ const AliTRDCalStackPos* stack = dynamic_cast<const AliTRDCalStackPos*>(GetCachedCDBObject(kIDStack));
if (!stack)
return kFALSE;
// Returns the rotation of the stack from the nominal position.
//
- AliTRDCalStackPos* stack = dynamic_cast<AliTRDCalStackPos*>(GetCachedCDBObject(kIDStack));
+ const AliTRDCalStackPos* stack = dynamic_cast<const AliTRDCalStackPos*>(GetCachedCDBObject(kIDStack));
if (!stack)
return kFALSE;
// Returns the drift velocity for the given pad.
//
- AliTRDCalPad* calPad = dynamic_cast<AliTRDCalPad*> (GetCachedCDBObject(kIDVdrift));
+ const AliTRDCalPad* calPad = dynamic_cast<const AliTRDCalPad*> (GetCachedCDBObject(kIDVdrift));
if (!calPad)
return -1;
// Returns t0 for the given pad.
//
- AliTRDCalPad* calPad = dynamic_cast<AliTRDCalPad*> (GetCachedCDBObject(kIDT0));
+ const AliTRDCalPad* calPad = dynamic_cast<const AliTRDCalPad*> (GetCachedCDBObject(kIDT0));
if (!calPad)
return -1;
// Returns the gain factor for the given pad.
//
- AliTRDCalPad* calPad = dynamic_cast<AliTRDCalPad*> (GetCachedCDBObject(kIDGainFactor));
+ const AliTRDCalPad* calPad = dynamic_cast<const AliTRDCalPad*> (GetCachedCDBObject(kIDGainFactor));
if (!calPad)
return -1;
// Returns the PRF width for the given pad.
//
- AliTRDCalPad* calPad = dynamic_cast<AliTRDCalPad*> (GetCachedCDBObject(kIDPRFWidth));
+ const AliTRDCalPad* calPad = dynamic_cast<const AliTRDCalPad*> (GetCachedCDBObject(kIDPRFWidth));
if (!calPad)
return -1;
// Returns the sampling frequency of the TRD read-out.
//
- AliTRDCalGlobals* calGlobal = dynamic_cast<AliTRDCalGlobals*> (GetCachedCDBObject(kIDGlobals));
+ const AliTRDCalGlobals* calGlobal = dynamic_cast<const AliTRDCalGlobals*> (GetCachedCDBObject(kIDGlobals));
if (!calGlobal)
return -1;
// Returns the number of time bins which are read-out.
//
- AliTRDCalGlobals* calGlobal = dynamic_cast<AliTRDCalGlobals*> (GetCachedCDBObject(kIDGlobals));
+ const AliTRDCalGlobals* calGlobal = dynamic_cast<const AliTRDCalGlobals*> (GetCachedCDBObject(kIDGlobals));
if (!calGlobal)
return -1;
}
//_____________________________________________________________________________
-AliTRDCalPIDLQ* AliTRDcalibDB::GetPIDLQObject()
+const AliTRDCalPIDLQ* AliTRDcalibDB::GetPIDLQObject()
{
//
// Returns the object storing the distributions for PID with likelihood
//
- // FAKE
- /*AliTRDCalPIDLQ* pid = new AliTRDCalPIDLQ();
- pid->ReadData("$ALICE_ROOT/TRD/TRDdEdxHistogramsV1.root");
- return pid;*/
-
- // TODO due to a bug in the CDB this does not work yet
- return dynamic_cast<AliTRDCalPIDLQ*> (GetCachedCDBObject(kIDPIDLQ));
+ return dynamic_cast<const AliTRDCalPIDLQ* const> (GetCachedCDBObject(kIDPIDLQ));
}
//_____________________________________________________________________________
#include <AliCDBStorage.h>
#include <AliCDBEntry.h>
-//includes neccessary here for compiliation of dynamic_cast
-#include "AliTRDCalPad.h"
-#include "AliTRDCalDet.h"
-
class AliTRDCalPIDLQ;
class AliTRDcalibDB : public TObject
Float_t GetSamplingFrequency();
Int_t GetNumberOfTimeBins();
- AliTRDCalPIDLQ* GetPIDLQObject();
+ const AliTRDCalPIDLQ* GetPIDLQObject();
//Related functions, these depend on calibration data
static Float_t GetOmegaTau(Float_t vdrift);
Int_t PadResponse(Double_t signal, Double_t dist, Int_t plane, Double_t *pad) const;
protected:
+ // for caching see also implentation of GetCachedCDBObject in the .cxx file
enum { kCDBCacheSize = 8 }; // Number of cached objects
enum { kIDVdrift = 0, kIDT0 = 1, kIDGainFactor = 2, kIDPRFWidth = 3, kIDGlobals = 4,
kIDChamber = 5, kIDStack = 6, kIDPIDLQ = 7 }; // IDs of cached objects
- TObject* GetCachedCDBObject(Int_t id)
- {
- //
- // Retrieves a cdb object with the given id. The objects are cached as long as the run number is not changed.
- //
- // Put together the available objects here by using the lines
- // a) For usual calibration objects:
- // ase kID<Name> : return CacheCDBEntry(kID<Name>, "TRD/Calib/<Path>"); break;
- // See function CacheCDBEntry for details.
- // and
- // b) For calibration data which depends on two objects: One containing a value per detector and one the local fluctuations per pad:
- // case kID<Name> : return CacheMergeCDBEntry(kID<Name>, "TRD/Calib/<padPath>", "TRD/Calib/<chamberPath>"); break;
- // See function CacheMergeCDBEntry for details.
- //
-
- switch (id)
- {
- // parameters defined per pad and chamber
- case kIDVdrift : return CacheMergeCDBEntry(kIDVdrift, "TRD/Calib/LocalVdrift", "TRD/Calib/ChamberVdrift"); break;
- case kIDT0 : return CacheMergeCDBEntry(kIDT0, "TRD/Calib/LocalT0", "TRD/Calib/ChamberT0"); break;
-
- // parameters defined per pad
- case kIDGainFactor : return CacheCDBEntry(kIDGainFactor, "TRD/Calib/GainFactor"); break;
- case kIDPRFWidth : return CacheCDBEntry(kIDPRFWidth, "TRD/Calib/PRFWidth"); break;
-
- // global parameters
- case kIDGlobals : return CacheCDBEntry(kIDGlobals, "TRD/Calib/Globals"); break;
- case kIDChamber : return CacheCDBEntry(kIDChamber, "TRD/Calib/Chamber"); break;
- case kIDStack : return CacheCDBEntry(kIDStack, "TRD/Calib/Stack"); break;
- case kIDPIDLQ : return CacheCDBEntry(kIDPIDLQ, "TRD/Calib/PIDLQ"); break;
- }
- return 0;
- }
+ const TObject* GetCachedCDBObject(Int_t id);
void Invalidate();
void SamplePRF();
- inline AliCDBEntry* GetCDBEntry(const char* cdbPath);
- inline TObject* CacheCDBEntry(Int_t id, const char* cdbPath);
- inline TObject* CacheMergeCDBEntry(Int_t id, const char* cdbPadPath, const char* cdbChamberPath);
+ AliCDBEntry* GetCDBEntry(const char* cdbPath);
+ const TObject* CacheCDBEntry(Int_t id, const char* cdbPath);
+ const TObject* CacheMergeCDBEntry(Int_t id, const char* cdbPadPath, const char* cdbChamberPath);
static AliTRDcalibDB* fgInstance; // Instance of this class (singleton implementation)
static Bool_t fgTerminated; // Defines if this class has already been terminated and therefore does not return instances in GetInstance anymore
ClassDef(AliTRDcalibDB, 0)
};
-AliCDBEntry* AliTRDcalibDB::GetCDBEntry(const char* cdbPath)
-{
- //
- // Retrieves an entry with path <cdbPath> from the CDB.
- //
-
- if (fRun < 0)
- {
- AliFatal("AliTRDcalibDB: Run number not set! Use AliTRDcalibDB::SetRun.");
- //std::cerr << "AliTRDcalibDB: Run number not set! Use AliTRDcalibDB::SetRun." << std::endl;
- return 0;
- }
- if (!fLocator)
- {
- std::cerr << "AliTRDcalibDB: Storage Locator not available." << std::endl;
- return 0;
- }
- AliCDBEntry* entry = fLocator->Get(cdbPath, fRun);
- if (!entry)
- {
- std::cerr << "AliTRDcalibDB: Failed to get entry: " << cdbPath << std::endl;
- return 0;
- }
-
- std::cout << "AliTRDcalibDB: Retrieved object: " << cdbPath << std::endl;
- return entry;
-}
-
-TObject* AliTRDcalibDB::CacheCDBEntry(Int_t id, const char* cdbPath)
-{
- //
- // Caches the entry <id> with cdb path <cdbPath>
- //
-
- if (!fCDBCache[id])
- {
- fCDBEntries[id] = GetCDBEntry(cdbPath);
- if (fCDBEntries[id])
- fCDBCache[id] = fCDBEntries[id]->GetObject();
- }
- return fCDBCache[id];
-}
-
-TObject* AliTRDcalibDB::CacheMergeCDBEntry(Int_t id, const char* cdbPadPath, const char* cdbChamberPath)
-{
- //
- // Retrieves and caches an object (id <id>) from the CDB. This function is specialized for parameters which are stored
- // as local variation at pad level of a global variable defined per detector chamber. It uses the classes AliTRDCalPad and AliTRDCalDet.
- // Before storing the object it retrieves the local variations (cdbPadPath) and the global variable (cdbChamberPath) and merges them using
- // the AliTRDCalPad::ScaleROCs.
- //
-
- if (!fCDBCache[id])
- {
- AliTRDCalPad* padObject = 0;
- AliTRDCalDet* detObject = 0;
-
- fCDBEntries[id] = GetCDBEntry(cdbPadPath);
- if (fCDBEntries[id])
- padObject = dynamic_cast<AliTRDCalPad*>(fCDBEntries[id]->GetObject());
-
- AliCDBEntry* mergeEntry = GetCDBEntry(cdbChamberPath);
- if (mergeEntry)
- detObject = dynamic_cast<AliTRDCalDet*>(mergeEntry->GetObject());
-
- if (!padObject || !detObject)
- {
- if (fCDBEntries[id]) {
- if (fCDBEntries[id]->IsOwner() == kFALSE && padObject)
- delete padObject;
- delete fCDBEntries[id];
- fCDBEntries[id] = 0;
- }
- if (mergeEntry)
- {
- if (mergeEntry->IsOwner() == kFALSE && detObject)
- delete detObject;
- delete mergeEntry;
- }
- return 0;
- }
-
- padObject->ScaleROCs(detObject);
- if (mergeEntry->IsOwner() == kFALSE)
- delete detObject;
- delete mergeEntry;
-
- fCDBCache[id] = padObject;
- }
-
- return fCDBCache[id];
-}
-
#endif