1) if the run number stored in the CDBmanager is negative, the CDB is accessed with run 0. The cache for ITS is temporarily disabled and the calibration objects, stored in AliITSDetType* are deleted by the container class destructor.
2) if the run number is >=0, the cache is enabled and the calibration object are not deleted by the ITS container destructor
3) if the GetCalibration method is called more than once per run, the access to CDB is not attempted more than once
Massimo
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* *
* Author: The ALICE Off-line Project. *
- * Contributors are mentioned in the code where appropriate. *
+ * Conributors are mentioned in the code where appropriate. *
* *
* Permission to use, copy, modify and distribute this software and its *
* documentation strictly for non-commercial purposes is hereby granted *
SelectVertexer(" ");
fLoader = 0;
fRunNumber = 0;
+ fFirstcall = kTRUE;
}
//________________________________________________________________
fLoader = loader;
SetRunNumber();
+ fFirstcall = kTRUE;
}
//______________________________________________________________________
AliITSDetTypeRec::AliITSDetTypeRec(const AliITSDetTypeRec &/*rec*/):TObject(/*rec*/){
delete fSegmentation;
fSegmentation = 0;
}
- if(fCalibration){
+ if(fCalibration && fRunNumber<0){
AliITSresponse* rspd = ((AliITSCalibration*)fCalibration->At(GetITSgeom()->GetStartSPD()))->GetResponse();
AliITSresponse* rsdd = ((AliITSCalibration*)fCalibration->At(GetITSgeom()->GetStartSDD()))->GetResponse();
AliITSresponse* rssd = ((AliITSCalibration*)fCalibration->At(GetITSgeom()->GetStartSSD()))->GetResponse();
Bool_t AliITSDetTypeRec::GetCalibration() {
// Get Default calibration if a storage is not defined.
+ if(!fFirstcall){
+ AliITSCalibration* cal = GetCalibrationModel(0);
+ if(cal)return kTRUE;
+ }
+ else {
+ fFirstcall = kFALSE;
+ }
- AliCDBEntry *entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSPD", fRunNumber);
- AliCDBEntry *entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD", fRunNumber);
- AliCDBEntry *entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD", fRunNumber);
- AliCDBEntry *entry2SPD = AliCDBManager::Instance()->Get("ITS/Calib/RespSPD", fRunNumber);
- AliCDBEntry *entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD", fRunNumber);
- AliCDBEntry *entry2SSD = AliCDBManager::Instance()->Get("ITS/Calib/RespSSD", fRunNumber);
+ SetRunNumber((Int_t)AliCDBManager::Instance()->GetRun());
+ Int_t run=GetRunNumber();
+ if(run<0)run=0; // if the run number is not yet set, use fake run # 0
+
+ Bool_t origCacheStatus = AliCDBManager::Instance()->GetCacheFlag();
+ Bool_t isCacheActive = kTRUE;
+ if(GetRunNumber()<0)isCacheActive=kFALSE;
+ if (fCalibration==0) {
+ fCalibration = new TObjArray(GetITSgeom()->GetIndexMax());
+ fCalibration->SetOwner(isCacheActive);
+ fCalibration->Clear();
+ }
+
+ AliCDBManager::Instance()->SetCacheFlag(isCacheActive);
+
+ AliCDBEntry *entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSPD", run);
+ AliCDBEntry *entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD", run);
+ AliCDBEntry *entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD", run);
+ AliCDBEntry *entry2SPD = AliCDBManager::Instance()->Get("ITS/Calib/RespSPD", run);
+ AliCDBEntry *entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD", run);
+ AliCDBEntry *entry2SSD = AliCDBManager::Instance()->Get("ITS/Calib/RespSSD", run);
if(!entrySPD || !entrySDD || !entrySSD || !entry2SPD || !entry2SDD || !entry2SSD){
AliWarning("Calibration object retrieval failed! Dummy calibration will be used.");
AliCDBStorage *origStorage = AliCDBManager::Instance()->GetDefaultStorage();
AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT");
- entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSPD", fRunNumber);
- entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD", fRunNumber);
- entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD", fRunNumber);
- entry2SPD = AliCDBManager::Instance()->Get("ITS/Calib/RespSPD", fRunNumber);
- entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD", fRunNumber);
- entry2SSD = AliCDBManager::Instance()->Get("ITS/Calib/RespSSD", fRunNumber);
+ entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSPD", run);
+ entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD", run);
+ entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD", run);
+ entry2SPD = AliCDBManager::Instance()->Get("ITS/Calib/RespSPD", run);
+ entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD", run);
+ entry2SSD = AliCDBManager::Instance()->Get("ITS/Calib/RespSSD", run);
AliCDBManager::Instance()->SetDefaultStorage(origStorage);
}
- TObjArray *respSPD = (TObjArray *)entrySPD->GetObject();
- entrySPD->SetObject(NULL);
+ TObjArray *calSPD = (TObjArray *)entrySPD->GetObject();
+ if(!isCacheActive)entrySPD->SetObject(NULL);
entrySPD->SetOwner(kTRUE);
AliITSresponseSPD *pSPD = (AliITSresponseSPD*)entry2SPD->GetObject();
- entry2SPD->SetObject(NULL);
+ if(!isCacheActive)entry2SPD->SetObject(NULL);
entry2SPD->SetOwner(kTRUE);
- TObjArray *respSDD = (TObjArray *)entrySDD->GetObject();
- entrySDD->SetObject(NULL);
+ TObjArray *calSDD = (TObjArray *)entrySDD->GetObject();
+ if(!isCacheActive)entrySDD->SetObject(NULL);
entrySDD->SetOwner(kTRUE);
AliITSresponseSDD *pSDD = (AliITSresponseSDD*)entry2SDD->GetObject();
- entry2SDD->SetObject(NULL);
+ if(!isCacheActive)entry2SDD->SetObject(NULL);
entry2SDD->SetOwner(kTRUE);
- TObjArray *respSSD = (TObjArray *)entrySSD->GetObject();
- entrySSD->SetObject(NULL);
+ TObjArray *calSSD = (TObjArray *)entrySSD->GetObject();
+ if(!isCacheActive)entrySSD->SetObject(NULL);
entrySSD->SetOwner(kTRUE);
AliITSresponseSSD *pSSD = (AliITSresponseSSD*)entry2SSD->GetObject();
- entry2SSD->SetObject(NULL);
+ if(!isCacheActive)entry2SSD->SetObject(NULL);
entry2SSD->SetOwner(kTRUE);
- // DB entries are dleted. In this waymetadeta objects are deleted as well
- delete entrySPD;
- delete entrySDD;
- delete entrySSD;
- delete entry2SPD;
- delete entry2SDD;
- delete entry2SSD;
+ // DB entries are deleted. In this way metadeta objects are deleted as well
+ if(!isCacheActive){
+ delete entrySPD;
+ delete entrySDD;
+ delete entrySSD;
+ delete entry2SPD;
+ delete entry2SDD;
+ delete entry2SSD;
+ }
+ AliCDBManager::Instance()->SetCacheFlag(origCacheStatus);
- if ((!pSPD)||(!pSDD)||(!pSSD) || (!respSPD) || (!respSDD) || (!respSSD)) {
+ if ((!pSPD)||(!pSDD)||(!pSSD) || (!calSPD) || (!calSDD) || (!calSSD)) {
AliWarning("Can not get calibration from calibration database !");
return kFALSE;
}
- fNMod[0] = respSPD->GetEntries();
- fNMod[1] = respSDD->GetEntries();
- fNMod[2] = respSSD->GetEntries();
+ fNMod[0] = calSPD->GetEntries();
+ fNMod[1] = calSDD->GetEntries();
+ fNMod[2] = calSSD->GetEntries();
AliInfo(Form("%i SPD, %i SDD and %i SSD in calibration database",
fNMod[0], fNMod[1], fNMod[2]));
- AliITSCalibration* res;
+ AliITSCalibration* cal;
for (Int_t i=0; i<fNMod[0]; i++) {
- res = (AliITSCalibration*) respSPD->At(i);
- res->SetResponse((AliITSresponse*)pSPD);
- SetCalibrationModel(i, res);
+ cal = (AliITSCalibration*) calSPD->At(i);
+ cal->SetResponse((AliITSresponse*)pSPD);
+ SetCalibrationModel(i, cal);
}
for (Int_t i=0; i<fNMod[1]; i++) {
- res = (AliITSCalibration*) respSDD->At(i);
- res->SetResponse((AliITSresponse*)pSDD);
+ cal = (AliITSCalibration*) calSDD->At(i);
+ cal->SetResponse((AliITSresponse*)pSDD);
Int_t iMod = i + fNMod[0];
- SetCalibrationModel(iMod, res);
+ SetCalibrationModel(iMod, cal);
}
for (Int_t i=0; i<fNMod[2]; i++) {
- res = (AliITSCalibration*) respSSD->At(i);
- res->SetResponse((AliITSresponse*)pSSD);
+ cal = (AliITSCalibration*) calSSD->At(i);
+ cal->SetResponse((AliITSresponse*)pSSD);
Int_t iMod = i + fNMod[0] + fNMod[1];
- SetCalibrationModel(iMod, res);
+ SetCalibrationModel(iMod, cal);
}
return kTRUE;
TString fSelectedVertexer; // Vertexer selected in CreateVertexer
AliITSLoader* fLoader; //! ITS loader
- Int_t fRunNumber; //! run number (to access DB)
+ Int_t fRunNumber; //! run number (to access DB)
+ Bool_t fFirstcall; //! flag
- ClassDef(AliITSDetTypeRec,5) // ITS Reconstruction structure
+ ClassDef(AliITSDetTypeRec,6) // ITS Reconstruction structure
};
#endif
fNMod[1] = fgkDefaultNModulesSDD;
fNMod[2] = fgkDefaultNModulesSSD;
SetRunNumber();
-
+ fFirstcall = kTRUE;
}
//----------------------------------------------------------------------
AliITSDetTypeSim::~AliITSDetTypeSim(){
fSegmentation = 0;
}
- if(fCalibration){
+ if(fCalibration && fRunNumber<0){
AliITSresponse* rspd = ((AliITSCalibration*)fCalibration->At(fGeom->GetStartSPD()))->GetResponse();
AliITSresponse* rsdd = ((AliITSCalibration*)fCalibration->At(fGeom->GetStartSDD()))->GetResponse();
AliITSresponse* rssd = ((AliITSCalibration*)fCalibration->At(fGeom->GetStartSSD()))->GetResponse();
//Create the container of calibration functions with correct size
if (fCalibration) {
+ Warning("CreateCalibration","pointer to calibration object exists\n");
fCalibration->Delete();
delete fCalibration;
}
- Int_t nModTot = 0;
- for (Int_t i=0; i<fgkNdettypes; i++) nModTot += fNMod[i];
+ Int_t nModTot = fGeom->GetIndexMax();
fCalibration = new TObjArray(nModTot);
fCalibration->SetOwner(kTRUE);
fCalibration->Clear();
void AliITSDetTypeSim::ResetCalibrationArray(){
//resets response array
- if(fCalibration)
+ if(fCalibration && fRunNumber<0){ // if fRunNumber<0 fCalibration is owner
+ AliITSresponse* rspd = ((AliITSCalibration*)fCalibration->At(fGeom->GetStartSPD()))->GetResponse();
+ AliITSresponse* rsdd = ((AliITSCalibration*)fCalibration->At(fGeom->GetStartSDD()))->GetResponse();
+ AliITSresponse* rssd = ((AliITSCalibration*)fCalibration->At(fGeom->GetStartSSD()))->GetResponse();
+ if(rspd) delete rspd;
+ if(rsdd) delete rsdd;
+ if(rssd) delete rssd;
fCalibration->Clear();
-
+ }
+ else if (fCalibration && fRunNumber>=0){
+ fCalibration->Clear();
+ }
}
//______________________________________________________________________
void AliITSDetTypeSim::ResetSegmentation(){
Warning("SetDefaults","fGeom is 0!");
return;
}
- if (fCalibration==0) CreateCalibrationArray();
+ if (fCalibration==0) {
+ CreateCalibrationArray();
+ }
- ResetCalibrationArray();
ResetSegmentation();
if(!GetCalibration()){AliFatal("Exit"); exit(0);}
Bool_t AliITSDetTypeSim::GetCalibration() {
// Get Default calibration if a storage is not defined.
- AliCDBEntry *entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSPD", fRunNumber);
- AliCDBEntry *entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD", fRunNumber);
- AliCDBEntry *entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD", fRunNumber);
- AliCDBEntry *entry2SPD = AliCDBManager::Instance()->Get("ITS/Calib/RespSPD", fRunNumber);
- AliCDBEntry *entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD", fRunNumber);
- AliCDBEntry *entry2SSD = AliCDBManager::Instance()->Get("ITS/Calib/RespSSD", fRunNumber);
+ if(!fFirstcall){
+ AliITSCalibration* cal = GetCalibrationModel(0);
+ if(cal)return kTRUE;
+ }
+ else {
+ fFirstcall = kFALSE;
+ }
+
+ SetRunNumber((Int_t)AliCDBManager::Instance()->GetRun());
+ Int_t run=GetRunNumber();
+ if(run<0)run=0; // if the run number is not yet set, use fake run # 0
+
+ Bool_t origCacheStatus = AliCDBManager::Instance()->GetCacheFlag();
+ Bool_t isCacheActive = kTRUE;
+ if(GetRunNumber()<0){
+ isCacheActive=kFALSE;
+ fCalibration->SetOwner(kTRUE);
+ }
+ else{
+ fCalibration->SetOwner(kFALSE);
+ }
+
+ AliCDBManager::Instance()->SetCacheFlag(isCacheActive);
+
+ AliCDBEntry *entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSPD", run);
+ AliCDBEntry *entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD", run);
+ AliCDBEntry *entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD", run);
+ AliCDBEntry *entry2SPD = AliCDBManager::Instance()->Get("ITS/Calib/RespSPD", run);
+ AliCDBEntry *entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD", run);
+ AliCDBEntry *entry2SSD = AliCDBManager::Instance()->Get("ITS/Calib/RespSSD", run);
if(!entrySPD || !entrySDD || !entrySSD || !entry2SPD || !entry2SDD || !entry2SSD){
AliWarning("Calibration object retrieval failed! Dummy calibration will be used.");
AliCDBStorage *origStorage = AliCDBManager::Instance()->GetDefaultStorage();
AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT");
- entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSPD", fRunNumber);
- entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD", fRunNumber);
- entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD", fRunNumber);
- entry2SPD = AliCDBManager::Instance()->Get("ITS/Calib/RespSPD", fRunNumber);
- entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD", fRunNumber);
- entry2SSD = AliCDBManager::Instance()->Get("ITS/Calib/RespSSD", fRunNumber);
+ entrySPD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSPD", run);
+ entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD", run);
+ entrySSD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSSD", run);
+ entry2SPD = AliCDBManager::Instance()->Get("ITS/Calib/RespSPD", run);
+ entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD", run);
+ entry2SSD = AliCDBManager::Instance()->Get("ITS/Calib/RespSSD", run);
AliCDBManager::Instance()->SetDefaultStorage(origStorage);
}
- TObjArray *respSPD = (TObjArray *)entrySPD->GetObject();
- entrySPD->SetObject(NULL);
+ TObjArray *calSPD = (TObjArray *)entrySPD->GetObject();
+ if(!isCacheActive)entrySPD->SetObject(NULL);
entrySPD->SetOwner(kTRUE);
AliITSresponseSPD *pSPD = (AliITSresponseSPD*)entry2SPD->GetObject();
- entry2SPD->SetObject(NULL);
+ if(!isCacheActive)entry2SPD->SetObject(NULL);
entry2SPD->SetOwner(kTRUE);
- TObjArray *respSDD = (TObjArray *)entrySDD->GetObject();
- entrySDD->SetObject(NULL);
+ TObjArray *calSDD = (TObjArray *)entrySDD->GetObject();
+ if(!isCacheActive)entrySDD->SetObject(NULL);
entrySDD->SetOwner(kTRUE);
AliITSresponseSDD *pSDD = (AliITSresponseSDD*)entry2SDD->GetObject();
- entry2SDD->SetObject(NULL);
+ if(!isCacheActive)entry2SDD->SetObject(NULL);
entry2SDD->SetOwner(kTRUE);
- TObjArray *respSSD = (TObjArray *)entrySSD->GetObject();
- entrySSD->SetObject(NULL);
+ TObjArray *calSSD = (TObjArray *)entrySSD->GetObject();
+ if(!isCacheActive)entrySSD->SetObject(NULL);
entrySSD->SetOwner(kTRUE);
AliITSresponseSSD *pSSD = (AliITSresponseSSD*)entry2SSD->GetObject();
- entry2SSD->SetObject(NULL);
+ if(!isCacheActive)entry2SSD->SetObject(NULL);
entry2SSD->SetOwner(kTRUE);
- // DB entries are dleted. In this waymetadeta objects are deleted as well
- delete entrySPD;
- delete entrySDD;
- delete entrySSD;
- delete entry2SPD;
- delete entry2SDD;
- delete entry2SSD;
+ // DB entries are deleted. In this way metadeta objects are deleted as well
+ if(!isCacheActive){
+ delete entrySPD;
+ delete entrySDD;
+ delete entrySSD;
+ delete entry2SPD;
+ delete entry2SDD;
+ delete entry2SSD;
+ }
+ AliCDBManager::Instance()->SetCacheFlag(origCacheStatus);
+
if ((!pSPD)||(!pSDD)||(!pSSD)) {
AliWarning("Can not get calibration from calibration database !");
return kFALSE;
}
- if ((! respSPD)||(! respSDD)||(! respSSD)) {
+ if ((! calSPD)||(! calSDD)||(! calSSD)) {
AliWarning("Can not get calibration from calibration database !");
return kFALSE;
}
- fNMod[0] = respSPD->GetEntries();
- fNMod[1] = respSDD->GetEntries();
- fNMod[2] = respSSD->GetEntries();
+ fNMod[0] = calSPD->GetEntries();
+ fNMod[1] = calSDD->GetEntries();
+ fNMod[2] = calSSD->GetEntries();
AliInfo(Form("%i SPD, %i SDD and %i SSD in calibration database",
fNMod[0], fNMod[1], fNMod[2]));
- AliITSCalibration* res;
+ AliITSCalibration* cal;
for (Int_t i=0; i<fNMod[0]; i++) {
- res = (AliITSCalibration*) respSPD->At(i);
- res->SetResponse((AliITSresponse*)pSPD);
- SetCalibrationModel(i, res);
+ cal = (AliITSCalibration*) calSPD->At(i);
+ cal->SetResponse(pSPD);
+ SetCalibrationModel(i, cal);
}
for (Int_t i=0; i<fNMod[1]; i++) {
- res = (AliITSCalibration*) respSDD->At(i);
- res->SetResponse(pSDD);
+ cal = (AliITSCalibration*) calSDD->At(i);
+ cal->SetResponse(pSDD);
Int_t iMod = i + fNMod[0];
- SetCalibrationModel(iMod, res);
+ SetCalibrationModel(iMod, cal);
}
for (Int_t i=0; i<fNMod[2]; i++) {
- res = (AliITSCalibration*) respSSD->At(i);
- res->SetResponse((AliITSresponse*)pSSD);
+ cal = (AliITSCalibration*) calSSD->At(i);
+ cal->SetResponse(pSSD);
Int_t iMod = i + fNMod[0] + fNMod[1];
- SetCalibrationModel(iMod, res);
+ SetCalibrationModel(iMod, cal);
}
return kTRUE;
if(!treeS){
return;
}
- if (fSDigits == 0x0){
+ if (fSDigits == 0x0){
fSDigits = new TClonesArray("AliITSpListItem",1000);
}
TBranch *branch;
Int_t fNSDigits; //! number of SDigits
TClonesArray *fSDigits; //! [NMod][NSDigits]
Int_t* fNDigits; //! [NDet] number of Digits for det.
- Int_t fRunNumber; //! run number (to access DB)
+ Int_t fRunNumber; //! run number (to access DB)
TObjArray *fDigits; //! [NMod][NDigits]
TString fHitClassName; //! String with Hit class name
TString fSDigClassName;//! String with SDigit class name.
Char_t* fDigClassName[3]; //! String with digit class name.
- AliLoader* fLoader; // loader
+ AliLoader* fLoader; //! loader
+ Bool_t fFirstcall; //! flag
- ClassDef(AliITSDetTypeSim,3) // ITS Simulation structure
+ ClassDef(AliITSDetTypeSim,4) // ITS Simulation structure
};
Int_t i;
Float_t bx[256],bz[280];
- fDetTypeSim->ResetCalibrationArray();
- fDetTypeSim->ResetSegmentation();
fDetTypeSim->SetDefaults();