#include "AliTPCCalibVdrift.h"
#include "AliTPCCalibRaw.h"
#include "AliTPCParam.h"
-
+#include "AliTPCCorrection.h"
+#include "AliTPCComposedCorrection.h"
#include "AliTPCPreprocessorOnline.h"
fDedxGainFactor(0),
fPadTime0(0),
fDistortionMap(0),
+ fComposedCorrection(0),
+ fComposedCorrectionArray(0),
fPadNoise(0),
fPedestals(0),
fCalibRaw(0),
fVdriftArray(100000), //! array of v drift interfaces
fDriftCorrectionArray(100000), //! array of drift correction
fRunList(100000), //! run list - indicates try to get the run param
+ fBHasAlignmentOCDB(kFALSE), // Flag - has the alignment on the composed correction ?
fDButil(0),
- fCTPTimeParams(0)
+ fCTPTimeParams(0),
+ fMode(-1)
{
//
// constructor
//
//
+ fgInstance=this;
Update(); // temporary
}
fDedxGainFactor(0),
fPadTime0(0),
fDistortionMap(0),
+ fComposedCorrection(0),
+ fComposedCorrectionArray(0),
fPadNoise(0),
fPedestals(0),
fCalibRaw(0),
fVoltageArray(0),
fTemperatureArray(0), //! array of temperature sensors - per run - Just for calibration studies
fVdriftArray(0), //! array of v drift interfaces
- fDriftCorrectionArray(0), //! array of v drift interfaces
+ fDriftCorrectionArray(0), //! array of v drift corrections
fRunList(0), //! run list - indicates try to get the run param
+ fBHasAlignmentOCDB(kFALSE), // Flag - has the alignment on the composed correction ?
fDButil(0),
- fCTPTimeParams(0)
+ fCTPTimeParams(0),
+ fMode(-1)
{
//
// Copy constructor invalid -- singleton implementation
//
}
-
+AliTPCCalPad* AliTPCcalibDB::GetDistortionMap(Int_t i) const {
+ //
+ // get distortion map - due E field distortions
+ //
+ return (fDistortionMap) ? (AliTPCCalPad*)fDistortionMap->At(i):0;
+}
//_____________________________________________________________________________
AliCDBEntry* AliTPCcalibDB::GetCDBEntry(const char* cdbPath)
AliCDBEntry* entry = AliCDBManager::Instance()->Get(cdbPath, fRun);
if (!entry)
{
- sprintf(chinfo,"AliTPCcalibDB: Failed to get entry:\t%s ", cdbPath);
+ snprintf(chinfo,1000,"AliTPCcalibDB: Failed to get entry:\t%s ", cdbPath);
AliError(chinfo);
return 0;
}
void AliTPCcalibDB::Update(){
- //
+ //
+ // cache the OCDB entries for simulation, reconstruction, calibration
+ //
+ //
AliCDBEntry * entry=0;
Bool_t cdbCache = AliCDBManager::Instance()->GetCacheFlag(); // save cache status
AliCDBManager::Instance()->SetCacheFlag(kTRUE); // activate CDB cache
fDButil = new AliTPCcalibDButil;
//
+
entry = GetCDBEntry("TPC/Calib/PadGainFactor");
if (entry){
//if (fPadGainFactor) delete fPadGainFactor;
entry->SetOwner(kTRUE);
fPadGainFactor = (AliTPCCalPad*)entry->GetObject();
}else{
- AliFatal("TPC - Missing calibration entry")
+ AliFatal("TPC - Missing calibration entry TPC/Calib/PadGainFactor");
}
//
entry = GetCDBEntry("TPC/Calib/TimeGain");
entry->SetOwner(kTRUE);
fTimeGainSplines = (TObjArray*)entry->GetObject();
}else{
- AliFatal("TPC - Missing calibration entry")
+ AliFatal("TPC - Missing calibration entry TPC/Calib/Timegain");
}
//
entry = GetCDBEntry("TPC/Calib/GainFactorDedx");
entry->SetOwner(kTRUE);
fDedxGainFactor = (AliTPCCalPad*)entry->GetObject();
}else{
- AliFatal("TPC - Missing calibration entry")
+ AliFatal("TPC - Missing calibration entry TPC/Calib/gainFactordEdx");
}
//
entry = GetCDBEntry("TPC/Calib/PadTime0");
entry->SetOwner(kTRUE);
fPadTime0 = (AliTPCCalPad*)entry->GetObject();
}else{
- AliFatal("TPC - Missing calibration entry")
+ AliFatal("TPC - Missing calibration entry");
}
entry = GetCDBEntry("TPC/Calib/Distortion");
if (entry){
//if (fPadTime0) delete fPadTime0;
entry->SetOwner(kTRUE);
- fDistortionMap =(TObjArray*)entry->GetObject();
+ fDistortionMap =dynamic_cast<TObjArray*>(entry->GetObject());
}else{
//AliFatal("TPC - Missing calibration entry")
}
entry->SetOwner(kTRUE);
fPadNoise = (AliTPCCalPad*)entry->GetObject();
}else{
- AliFatal("TPC - Missing calibration entry")
+ AliFatal("TPC - Missing calibration entry");
}
entry = GetCDBEntry("TPC/Calib/Pedestals");
entry->SetOwner(kTRUE);
fParam = (AliTPCParam*)(entry->GetObject()->Clone());
}else{
- AliFatal("TPC - Missing calibration entry")
+ AliFatal("TPC - Missing calibration entry TPC/Calib/Parameters");
}
entry = GetCDBEntry("TPC/Calib/ClusterParam");
entry->SetOwner(kTRUE);
fClusterParam = (AliTPCClusterParam*)(entry->GetObject()->Clone());
}else{
- AliFatal("TPC - Missing calibration entry")
+ AliFatal("TPC - Missing calibration entry");
}
//ALTRO configuration data
entry->SetOwner(kTRUE);
fALTROConfigData=(TObjArray*)(entry->GetObject());
}else{
- AliFatal("TPC - Missing calibration entry")
+ AliFatal("TPC - Missing calibration entry");
}
//Calibration Pulser data
//entry->SetOwner(kTRUE);
fCTPTimeParams=dynamic_cast<AliCTPTimeParams*>(entry->GetObject());
}else{
- AliFatal("TPC - Missing calibration entry")
+ AliError("TPC - Missing calibration entry");
}
+ //TPC space point correction data
+ entry = GetCDBEntry("TPC/Calib/Correction");
+ if (entry){
+ //entry->SetOwner(kTRUE);
+ fComposedCorrection=dynamic_cast<AliTPCCorrection*>(entry->GetObject());
+ if (fComposedCorrection) fComposedCorrection->Init();
+ fComposedCorrectionArray=dynamic_cast<TObjArray*>(entry->GetObject());
+ if (fComposedCorrectionArray){
+ for (Int_t i=0; i<fComposedCorrectionArray->GetEntries(); i++){
+ AliTPCComposedCorrection* composedCorrection= dynamic_cast<AliTPCComposedCorrection*>(fComposedCorrectionArray->At(i));
+ if (composedCorrection) {
+ composedCorrection->Init();
+ if (composedCorrection->GetCorrections()){
+ if (composedCorrection->GetCorrections()->FindObject("FitAlignTPC")){
+ fBHasAlignmentOCDB=kTRUE;
+ }
+ }
+ }
+ }
+ }
+ }else{
+ AliError("TPC - Missing calibration entry- TPC/Calib/Correction");
+ }
+ //RCU trigger config mode
+ fMode=GetRCUTriggerConfig();
//
if (!fTransform) {
fTransform=new AliTPCTransform();
fDataQA=dynamic_cast<AliTPCdataQA*>(entry->GetObject());
}
// High voltage
- entry = AliCDBManager::Instance()->Get("TPC/Calib/HighVoltage",fRun);
- if (entry) {
- fVoltageArray.AddAt(entry->GetObject(),fRun);
+ if (fRun>=0){
+ entry = AliCDBManager::Instance()->Get("TPC/Calib/HighVoltage",fRun);
+ if (entry) {
+ fVoltageArray.AddAt(entry->GetObject(),fRun);
+ }
}
}
//
// return if the FEE readout was triggered on L0
//
- Int_t mode=GetRCUTriggerConfig();
- if (mode<0) return kFALSE;
- return (mode==1);
+ if (fMode<0) return kFALSE;
+ return (fMode==1);
}
Bool_t AliTPCcalibDB::IsTrgL1()
//
// return if the FEE readout was triggered on L1
//
- Int_t mode=GetRCUTriggerConfig();
- if (mode<0) return kFALSE;
- return (mode==0);
+ if (fMode<0) return kFALSE;
+ return (fMode==0);
}
void AliTPCcalibDB::RegisterExB(Int_t index, Float_t bz, Bool_t bdelete){
// - > Don't use it for reconstruction - Only for Calibration studies
//
if (run<=0) return;
+ fRun=run;
AliCDBEntry * entry = 0;
if (run>= fRunList.fN){
fRunList.Set(run*2+1);
if (entry) {
fTimeGainSplinesArray.AddAt(entry->GetObject(),run);
}else{
- AliFatal("TPC - Missing calibration entry TimeGain")
+ AliFatal("TPC - Missing calibration entry TimeGain");
}
//
entry = AliCDBManager::Instance()->Get("TPC/Calib/TimeDrift",run);
if (entry) {
- fDriftCorrectionArray.AddAt(entry->GetObject(),run);
+ TObjArray * timeArray = (TObjArray*)entry->GetObject();
+ fDriftCorrectionArray.AddAt(entry->GetObject(),run);
+ AliTPCCorrection * correctionTime = (AliTPCCorrection *)timeArray->FindObject("FitCorrectionTime");
+ if (correctionTime && fComposedCorrectionArray){
+ correctionTime->Init();
+ if (fComposedCorrectionArray->GetEntriesFast()<4) fComposedCorrectionArray->Expand(40);
+ fComposedCorrectionArray->AddAt(correctionTime,4); //add time dependent correction to the list of available corrections
+ }
}else{
- AliFatal("TPC - Missing calibration entry TimeDrift")
+ AliFatal("TPC - Missing calibration entry TimeDrift");
}
//
entry = AliCDBManager::Instance()->Get("TPC/Calib/Temperature",run);
accept = fDButil->FilterTemperature(temp)>0.1;
}
if (press) {
- const Double_t kMinP=950.;
+ const Double_t kMinP=900.;
const Double_t kMaxP=1050.;
const Double_t kMaxdP=10.;
const Double_t kSigmaCut=4.;
fDButil->FilterSensor(press,kMinP,kMaxP,kMaxdP,kSigmaCut);
if (press->GetFit()==0) accept=kFALSE;
}
+
if (press && temp &&accept){
AliTPCCalibVdrift * vdrift = new AliTPCCalibVdrift(temp, press,0);
fVdriftArray.AddAt(vdrift,run);
}
+
fDButil->FilterCE(120., 3., 4.,0);
fDButil->FilterTracks(run, 10.,0);
+
}
Float_t AliTPCcalibDB::GetGain(Int_t sector, Int_t row, Int_t pad){
//
+ // Get Gain factor for given pad
//
AliTPCCalPad *calPad = Instance()->fDedxGainFactor;;
if (!calPad) return 0;
AliSplineFit* AliTPCcalibDB::GetVdriftSplineFit(const char* name, Int_t run){
//
- //
+ // GetDrift velocity spline fit
//
TObjArray *arr=GetTimeVdriftSplineRun(run);
if (!arr) return 0;
//
// Get GRP object for given run
//
+ if (run>= ((Instance()->fGRPArray)).GetEntriesFast()){
+ Instance()->UpdateRunInformations(run);
+ }
AliGRPObject * grpRun = dynamic_cast<AliGRPObject *>((Instance()->fGRPArray).At(run));
if (!grpRun) {
Instance()->UpdateRunInformations(run);
TMap * AliTPCcalibDB::GetGRPMap(Int_t run){
//
- //
+ // Get GRP map for given run
//
TMap * grpRun = dynamic_cast<TMap *>((Instance()->fGRPMaps).At(run));
if (!grpRun) {
//
// Get the interface to the the vdrift
//
+ if (run>=fVdriftArray.GetEntriesFast()) UpdateRunInformations(run);
AliTPCCalibVdrift * vdrift = (AliTPCCalibVdrift*)fVdriftArray.At(run);
if (!vdrift) {
UpdateRunInformations(run);
}
}
if (sigDigits>=0){
- val/=10;
+ // val/=10;
val=(Float_t)TMath::Floor(val * TMath::Power(10., sigDigits) + .5) / TMath::Power(10., sigDigits);
- val*=10;
+ // val*=10;
}
return val;
}
-Float_t AliTPCcalibDB::GetChamberHighVoltage(Int_t run, Int_t sector, Int_t timeStamp, Int_t sigDigits) {
+Float_t AliTPCcalibDB::GetChamberHighVoltage(Int_t run, Int_t sector, Int_t timeStamp, Int_t sigDigits, Bool_t current) {
//
// return the chamber HV for given run and time: 0-35 IROC, 36-72 OROC
// if timeStamp==-1 return mean value
//OROC
sensorName=Form("TPC_ANODE_O_%c%02d_0_VMEAS",sideName,sector%18);
}
+ if (current){
+ if (sector<36){
+ //IROC
+ sensorName=Form("TPC_ANODE_I_%c%02d_IMEAS",sideName,sector%18);
+ }else{
+ //OROC
+ sensorName=Form("TPC_ANODE_O_%c%02d_0_IMEAS",sideName,sector%18);
+ }
+
+ }
if (timeStamp==-1){
val=AliTPCcalibDB::GetDCSSensorMeanValue(voltageArray, sensorName.Data(),sigDigits);
} else {
Bool_t AliTPCcalibDB::GetTemperatureFit(Int_t timeStamp, Int_t run, Int_t side,TVectorD& fit){
//
- //
+ // GetTmeparature fit at parameter for given time stamp
//
TTimeStamp tstamp(timeStamp);
AliTPCSensorTempArray* tempArray = Instance()->GetTemperatureSensor(run);
Float_t AliTPCcalibDB::GetTemperature(Int_t timeStamp, Int_t run, Int_t side){
//
- //
- //
+ // Get mean temperature
+ //
TVectorD vec(5);
if (side==0) {
GetTemperatureFit(timeStamp,run,0,vec);
AliGRPObject *grpRun = new AliGRPObject;
grpRun->ReadValuesFromMap(map);
grpRun->SetCavernAtmosPressure(sensor2);
+ grpRun->SetCavernAtmosPressure(sensor2);
grpRun->SetSurfaceAtmosPressure(sensor);
return grpRun;
}
//
TString file(filename);
- if (file.IsNull()) file=Form("guiTreeRun_%d.root",fRun);
+ if (file.IsNull()) file=Form("guiTreeRun_%lld.root",fRun);
prep.DumpToFile(file.Data());
return kTRUE;
}
//
// Notice - Extrapolation outside of calibration range - using constant function
//
- Double_t result;
+ Double_t result=0;
// mode 1 automatic mode - according to the distance to the valid calibration
// -
Double_t deltaP=0, driftP=0, wP = 0.;
if (mode==1) {
const Double_t kEpsilon=0.00000000001;
const Double_t kdeltaT=360.; // 10 minutes
+ if(TMath::Abs(deltaITS) < 12*kdeltaT) {
+ result = driftITS;
+ } else {
wITS = 64.*kdeltaT/(deltaITS +kdeltaT);
wLT = 16.*kdeltaT/(deltaLT +kdeltaT);
wP = 0. *kdeltaT/(deltaP +kdeltaT);
if (TMath::Abs(driftCE)<kEpsilon) wCE=0; // invalid calibration
if (wP+wITS+wLT+wCE<kEpsilon) return 0;
result = (driftP*wP+driftITS*wITS+driftLT*wLT+driftCE*wCE)/(wP+wITS+wLT+wCE);
+ }
+
+
}
return result;
//
// Get global y correction drift velocity correction factor
// additive factor vd = vdnom*(1+GetVDriftCorrectionGy *gy)
- // Value etracted combining the vdrift correction using laser tracks and CE
+ // Value etracted combining the vdrift correction using laser tracks and CE or TPC-ITS
// Arguments:
- // mode determines the algorith how to combine the Laser Track, LaserCE
+ // mode determines the algorith how to combine the Laser Track, LaserCE or TPC-ITS
// timestamp - timestamp
// run - run number
// side - the drift velocity gy correction per side (CE and Laser tracks)
UpdateRunInformations(run,kFALSE);
TObjArray *array =AliTPCcalibDB::Instance()->GetTimeVdriftSplineRun(run);
if (!array) return 0;
+ Double_t result=0;
+
+ // use TPC-ITS if present
+ TGraphErrors *gr= (TGraphErrors*)array->FindObject("ALIGN_ITSB_TPC_VDGY");
+ if(gr) {
+ result = AliTPCcalibDButil::EvalGraphConst(gr,timeStamp);
+
+ // transform from [(cm/mus)/ m] to [1/cm]
+ result /= (fParam->GetDriftV()/1000000.);
+ result /= 100.;
+
+ //printf("result %e \n", result);
+ return result;
+ }
+
+ // use laser if ITS-TPC not present
TGraphErrors *laserA= (TGraphErrors*)array->FindObject("GRAPH_MEAN_GLOBALYGRADIENT_LASER_ALL_A");
TGraphErrors *laserC= (TGraphErrors*)array->FindObject("GRAPH_MEAN_GLOBALYGRADIENT_LASER_ALL_C");
- Double_t result=0;
if (laserA && laserC){
result= (laserA->Eval(timeStamp)+laserC->Eval(timeStamp))*0.5;
}
if (laserC &&side==1){
result = (laserC->Eval(timeStamp));
}
+ //printf("laser result %e \n", -result/250.);
+
return -result/250.; //normalized before
}
-AliTPCCalPad* AliTPCcalibDB::MakeDeadMap(const char* nameMappingFile) {
+AliTPCCalPad* AliTPCcalibDB::MakeDeadMap(Double_t notInMap, const char* nameMappingFile) {
//
// Read list of active DDLs from OCDB entry
// Generate and return AliTPCCalPad containing 1 for all pads in active DDLs,
// 0 for all pads in non-active DDLs.
+// For DDLs with missing status information (no DCS input point to Shuttle),
+// the value of the AliTPCCalPad entry is determined by the parameter
+// notInMap (default value 1)
//
char chinfo[1000];
TFile *fileMapping = new TFile(nameMappingFile, "read");
AliTPCmapper *mapping = (AliTPCmapper*) fileMapping->Get("tpcMapping");
if (!mapping) {
- sprintf(chinfo,"Failed to get mapping object from %s. ...\n", nameMappingFile);
+ snprintf(chinfo,1000,"Failed to get mapping object from %s. ...\n", nameMappingFile);
AliError (chinfo);
return 0;
}
Double_t active;
for (Int_t i=0; i<mapping->GetNumDdl(); i++) {
idDDL= i+offset;
+ if (idDDL<0) continue;
Int_t patch = mapping->GetPatchFromEquipmentID(idDDL);
+ if (patch<0) continue;
Int_t roc=mapping->GetRocFromEquipmentID(idDDL);
+ if (roc<0) continue;
AliTPCCalROC *calRoc=deadMap->GetCalROC(roc);
if (calRoc) {
for ( Int_t branch = 0; branch < 2; branch++ ) {
Int_t row = mapping->GetPadRow(patch, hwadd); // row in a ROC (IROC or OROC)
// Int_t globalrow = mapping.GetGlobalPadRow(patch, hwadd); // row in full sector (IROC plus OROC)
Int_t pad = mapping->GetPad(patch, hwadd);
- active=TString(arrDDL[i]).Atof();
+ if (!TString(arrDDL[i]).IsDigit()) {
+ active = notInMap;
+ } else {
+ active=TString(arrDDL[i]).Atof();
+ }
calRoc->SetValue(row,pad,active);
} // end channel for loop
} // end altro for loop
}
+
+AliTPCCorrection * AliTPCcalibDB::GetTPCComposedCorrection(Float_t field) const{
+ //
+ // GetComposed correction for given field setting
+ // If not specific correction for field used return correction for all field
+ // - Complication needed to gaurantee OCDB back compatibility
+ // - Not neeeded for the new space point correction
+ if (!fComposedCorrectionArray) return 0;
+ if (field>0.1 && fComposedCorrectionArray->At(1)) {
+ return (AliTPCCorrection *)fComposedCorrectionArray->At(1);
+ }
+ if (field<-0.1 &&fComposedCorrectionArray->At(2)) {
+ return (AliTPCCorrection *)fComposedCorrectionArray->At(2);
+ }
+ return (AliTPCCorrection *)fComposedCorrectionArray->At(0);
+
+}
+
+
+AliTPCCorrection * AliTPCcalibDB::GetTPCComposedCorrectionDelta() const{
+ //
+ // GetComposedCorrection delta
+ // Delta is time dependent - taken form the CalibTime OCDB entry
+ //
+ if (!fComposedCorrectionArray) return 0;
+ if (fRun<0) return 0;
+ if (fDriftCorrectionArray.GetEntriesFast()<=fRun) return 0;
+ if (fDriftCorrectionArray.At(fRun)==0) return 0;
+ if (fComposedCorrectionArray->GetEntriesFast()<=4) {
+ fComposedCorrectionArray->Expand(5);
+ TObjArray * timeArray =(TObjArray*)(fDriftCorrectionArray.At(fRun));
+ AliTPCCorrection * correctionTime = (AliTPCCorrection *)timeArray->FindObject("FitCorrectionTime");
+ if (correctionTime){
+ correctionTime->Init();
+ fComposedCorrectionArray->AddAt(correctionTime,4); //add time dependent c
+ }
+ }
+ return (AliTPCCorrection *)fComposedCorrectionArray->At(4); //
+}
+