#include <AliCDBManager.h>
#include <AliCDBEntry.h>
+#include <AliCDBId.h>
#include <AliLog.h>
#include <AliMagF.h>
#include <AliSplineFit.h>
+#include <AliCTPTimeParams.h>
#include "AliTPCcalibDB.h"
+#include "AliTPCdataQA.h"
+#include "AliTPCcalibDButil.h"
#include "AliTPCAltroMapping.h"
#include "AliTPCExB.h"
#include "AliTPCSensorTempArray.h"
#include "AliGRPObject.h"
#include "AliTPCTransform.h"
+#include "AliTPCmapper.h"
class AliCDBStorage;
class AliTPCCalDet;
#include "TFile.h"
#include "TKey.h"
+#include "TGraphErrors.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TString.h"
+#include "TDirectory.h"
+#include "TArrayI.h"
#include "AliTPCCalPad.h"
#include "AliTPCCalibPulser.h"
#include "AliTPCCalibPedestal.h"
#include "AliTPCExBFirst.h"
#include "AliTPCTempMap.h"
#include "AliTPCCalibVdrift.h"
-
+#include "AliTPCCalibRaw.h"
+#include "AliTPCParam.h"
+#include "AliTPCCorrection.h"
+#include "AliTPCComposedCorrection.h"
#include "AliTPCPreprocessorOnline.h"
fPadGainFactor(0),
fDedxGainFactor(0),
fPadTime0(0),
+ fDistortionMap(0),
+ fComposedCorrection(0),
+ fComposedCorrectionArray(0),
fPadNoise(0),
fPedestals(0),
+ fCalibRaw(0),
+ fDataQA(0),
fALTROConfigData(0),
fPulserData(0),
fCEData(0),
fTemperatureArray(100000), //! array of temperature sensors - per run - Just for calibration studies
fVdriftArray(100000), //! array of v drift interfaces
fDriftCorrectionArray(100000), //! array of drift correction
- fRunList(100000) //! run list - indicates try to get the run param
-
+ 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),
+ fMode(-1)
{
//
// constructor
//
//
+ fgInstance=this;
Update(); // temporary
}
fPadGainFactor(0),
fDedxGainFactor(0),
fPadTime0(0),
+ fDistortionMap(0),
+ fComposedCorrection(0),
+ fComposedCorrectionArray(0),
fPadNoise(0),
fPedestals(0),
+ fCalibRaw(0),
+ fDataQA(0),
fALTROConfigData(0),
fPulserData(0),
fCEData(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
- fRunList(0) //! run list - indicates try to get the run param
+ 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),
+ fMode(-1)
{
//
// Copy constructor invalid -- singleton implementation
// destructor
//
- // don't delete anything, CDB cache is active!
- //if (fPadGainFactor) delete fPadGainFactor;
- //if (fPadTime0) delete fPadTime0;
- //if (fPadNoise) delete fPadNoise;
}
-
+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(){
- //
- AliCDBEntry * entry=0;
-
+ //
+ // 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 TPC/Calib/PadGainFactor");
}
//
entry = GetCDBEntry("TPC/Calib/TimeGain");
//if (fTimeGainSplines) delete fTimeGainSplines;
entry->SetOwner(kTRUE);
fTimeGainSplines = (TObjArray*)entry->GetObject();
+ }else{
+ AliFatal("TPC - Missing calibration entry TPC/Calib/Timegain");
}
//
entry = GetCDBEntry("TPC/Calib/GainFactorDedx");
if (entry){
entry->SetOwner(kTRUE);
fDedxGainFactor = (AliTPCCalPad*)entry->GetObject();
+ }else{
+ AliFatal("TPC - Missing calibration entry TPC/Calib/gainFactordEdx");
}
//
entry = GetCDBEntry("TPC/Calib/PadTime0");
//if (fPadTime0) delete fPadTime0;
entry->SetOwner(kTRUE);
fPadTime0 = (AliTPCCalPad*)entry->GetObject();
+ }else{
+ AliFatal("TPC - Missing calibration entry");
+ }
+
+ entry = GetCDBEntry("TPC/Calib/Distortion");
+ if (entry){
+ //if (fPadTime0) delete fPadTime0;
+ entry->SetOwner(kTRUE);
+ fDistortionMap =dynamic_cast<TObjArray*>(entry->GetObject());
+ }else{
+ //AliFatal("TPC - Missing calibration entry")
}
+
+
//
//
entry = GetCDBEntry("TPC/Calib/PadNoise");
//if (fPadNoise) delete fPadNoise;
entry->SetOwner(kTRUE);
fPadNoise = (AliTPCCalPad*)entry->GetObject();
+ }else{
+ AliFatal("TPC - Missing calibration entry");
}
entry = GetCDBEntry("TPC/Calib/Pedestals");
//if (fPadNoise) delete fPadNoise;
entry->SetOwner(kTRUE);
fParam = (AliTPCParam*)(entry->GetObject()->Clone());
+ }else{
+ AliFatal("TPC - Missing calibration entry TPC/Calib/Parameters");
}
entry = GetCDBEntry("TPC/Calib/ClusterParam");
if (entry){
entry->SetOwner(kTRUE);
fClusterParam = (AliTPCClusterParam*)(entry->GetObject()->Clone());
+ }else{
+ AliFatal("TPC - Missing calibration entry");
}
//ALTRO configuration data
if (entry){
entry->SetOwner(kTRUE);
fALTROConfigData=(TObjArray*)(entry->GetObject());
+ }else{
+ AliFatal("TPC - Missing calibration entry");
}
//Calibration Pulser data
entry->SetOwner(kTRUE);
fCEData=(TObjArray*)(entry->GetObject());
}
+ //RAW calibration data
+ // entry = GetCDBEntry("TPC/Calib/Raw");
entry = GetCDBEntry("TPC/Calib/Mapping");
if (entry){
}
}
-
-
- //entry = GetCDBEntry("TPC/Calib/ExB");
- //if (entry) {
- // entry->SetOwner(kTRUE);
- // fExB=dynamic_cast<AliTPCExB*>(entry->GetObject()->Clone());
- //}
+ //CTP calibration data
+ entry = GetCDBEntry("GRP/CTP/CTPtiming");
+ if (entry){
+ //entry->SetOwner(kTRUE);
+ fCTPTimeParams=dynamic_cast<AliCTPTimeParams*>(entry->GetObject());
+ }else{
+ 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();
//
- // ExB - calculate during initialization
- // -
- fExB = GetExB(-5,kTRUE);
- //
if (!fTransform) {
fTransform=new AliTPCTransform();
fTransform->SetCurrentRun(AliCDBManager::Instance()->GetRun());
//
AliCDBManager::Instance()->SetCacheFlag(cdbCache); // reset original CDB cache
-
+}
+
+void AliTPCcalibDB::UpdateNonRec(){
+ //
+ // Update/Load the parameters which are important for QA studies
+ // and not used yet for the reconstruction
+ //
+ //RAW calibration data
+ AliCDBEntry * entry=0;
+ entry = GetCDBEntry("TPC/Calib/Raw");
+ if (entry){
+ entry->SetOwner(kTRUE);
+ TObjArray *arr=(TObjArray*)(entry->GetObject());
+ if (arr) fCalibRaw=(AliTPCCalibRaw*)arr->At(0);
+ }
+ //QA calibration data
+ entry = GetCDBEntry("TPC/Calib/QA");
+ if (entry){
+ entry->SetOwner(kTRUE);
+ fDataQA=dynamic_cast<AliTPCdataQA*>(entry->GetObject());
+ }
+ // High voltage
+ if (fRun>=0){
+ entry = AliCDBManager::Instance()->Get("TPC/Calib/HighVoltage",fRun);
+ if (entry) {
+ fVoltageArray.AddAt(entry->GetObject(),fRun);
+ }
+ }
+
}
}
}
+Int_t AliTPCcalibDB::GetRCUTriggerConfig() const
+{
+ //
+ // return the RCU trigger configuration register
+ //
+ TMap *map=GetRCUconfig();
+ if (!map) return -1;
+ TVectorF *v=(TVectorF*)map->GetValue("TRGCONF_TRG_MODE");
+ Float_t mode=-1;
+ for (Int_t i=0; i<v->GetNrows(); ++i){
+ Float_t newmode=v->GetMatrixArray()[i];
+ if (newmode>-1){
+ if (mode>-1&&newmode!=mode) AliWarning("Found different RCU trigger configurations!!!");
+ mode=newmode;
+ }
+ }
+ return (Int_t)mode;
+}
+Bool_t AliTPCcalibDB::IsTrgL0()
+{
+ //
+ // return if the FEE readout was triggered on L0
+ //
+ if (fMode<0) return kFALSE;
+ return (fMode==1);
+}
+
+Bool_t AliTPCcalibDB::IsTrgL1()
+{
+ //
+ // return if the FEE readout was triggered on L1
+ //
+ if (fMode<0) return kFALSE;
+ return (fMode==0);
+}
void AliTPCcalibDB::RegisterExB(Int_t index, Float_t bz, Bool_t bdelete){
//
// index - registration index - used for visualization
// bz - bz field in kGaus
- Float_t factor = bz/(-5.); // default b filed in Cheb with minus sign
+ // Float_t factor = bz/(-5.); // default b filed in Cheb with minus sign
+ Float_t factor = bz/(5.); // default b filed in Cheb with minus sign
+ // was chenged in the Revision ???? (Ruben can you add here number)
- AliMagF* bmap = new AliMagF("MapsExB","MapsExB", 2,factor,1., 10.,AliMagF::k5kG,"$(ALICE_ROOT)/data/maps/mfchebKGI_sym.root");
+ AliMagF* bmap = new AliMagF("MapsExB","MapsExB", factor,TMath::Sign(1.f,factor),AliMagF::k5kG);
AliTPCExBFirst *exb = new AliTPCExBFirst(bmap,0.88*2.6400e+04,50,50,50);
AliTPCExB::SetInstance(exb);
fExB = GetExB(bz,kFALSE);
}
+void AliTPCcalibDB::SetExBField(const AliMagF* bmap){
+ //
+ // Set magnetic field for ExB correction
+ //
+ AliTPCExBFirst *exb = new AliTPCExBFirst(bmap,0.88*2.6400e+04,50,50,50);
+ AliTPCExB::SetInstance(exb);
+ fExB=exb;
+}
+
//
// - > Don't use it for reconstruction - Only for Calibration studies
//
+ if (run<=0) return;
+ fRun=run;
AliCDBEntry * entry = 0;
- if (run>= fRunList.GetSize()){
+ if (run>= fRunList.fN){
fRunList.Set(run*2+1);
fGRPArray.Expand(run*2+1);
fGRPMaps.Expand(run*2+1);
fVdriftArray.Expand(run*2+1);
fDriftCorrectionArray.Expand(run*2+1);
fTimeGainSplinesArray.Expand(run*2+1);
+ //
+ //
+ fALTROConfigData->Expand(run*2+1); // ALTRO configuration data
+ fPulserData->Expand(run*2+1); // Calibration Pulser data
+ fCEData->Expand(run*2+1); // CE data
+ if (!fTimeGainSplines) fTimeGainSplines = new TObjArray(run*2+1);
+ fTimeGainSplines->Expand(run*2+1); // Array of AliSplineFits: at 0 MIP position in
}
if (fRunList[run]>0 &&force==kFALSE) return;
+
+ fRunList[run]=1; // sign as used
+
//
entry = AliCDBManager::Instance()->Get("GRP/GRP/Data",run);
if (entry) {
fGoofieArray.AddAt(entry->GetObject(),run);
}
//
- entry = AliCDBManager::Instance()->Get("TPC/Calib/HighVoltage",run);
- if (entry) {
- fVoltageArray.AddAt(entry->GetObject(),run);
- }
+
//
entry = AliCDBManager::Instance()->Get("TPC/Calib/TimeGain",run);
if (entry) {
fTimeGainSplinesArray.AddAt(entry->GetObject(),run);
+ }else{
+ 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");
}
//
entry = AliCDBManager::Instance()->Get("TPC/Calib/Temperature",run);
if (entry) {
fTemperatureArray.AddAt(entry->GetObject(),run);
}
- fRunList[run]=1; // sign as used
+ //apply fDButil filters
+
+ fDButil->UpdateFromCalibDB();
+ if (fTemperature) fDButil->FilterTemperature(fTemperature);
AliDCSSensor * press = GetPressureSensor(run,0);
AliTPCSensorTempArray * temp = GetTemperatureSensor(run);
- if (press && temp){
+ Bool_t accept=kTRUE;
+ if (temp) {
+ accept = fDButil->FilterTemperature(temp)>0.1;
+ }
+ if (press) {
+ 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;
return calPad->GetCalROC(sector)->GetValue(row,pad);
}
+AliSplineFit* AliTPCcalibDB::GetVdriftSplineFit(const char* name, Int_t run){
+ //
+ // GetDrift velocity spline fit
+ //
+ TObjArray *arr=GetTimeVdriftSplineRun(run);
+ if (!arr) return 0;
+ return dynamic_cast<AliSplineFit*>(arr->FindObject(name));
+}
+
+AliSplineFit* AliTPCcalibDB::CreateVdriftSplineFit(const char* graphName, Int_t run){
+ //
+ // create spline fit from the drift time graph in TimeDrift
+ //
+ TObjArray *arr=GetTimeVdriftSplineRun(run);
+ if (!arr) return 0;
+ TGraph *graph=dynamic_cast<TGraph*>(arr->FindObject(graphName));
+ if (!graph) return 0;
+ AliSplineFit *fit = new AliSplineFit();
+ fit->SetGraph(graph);
+ fit->SetMinPoints(graph->GetN()+1);
+ fit->InitKnots(graph,2,0,0.001);
+ fit->SplineFit(0);
+ return fit;
+}
AliGRPObject *AliTPCcalibDB::GetGRP(Int_t run){
//
// 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) {
return gainSplines;
}
+TObjArray * AliTPCcalibDB::GetTimeVdriftSplineRun(Int_t run){
+ //
+ // Get drift spline array
+ //
+ TObjArray * driftSplines = (TObjArray *)fDriftCorrectionArray.At(run);
+ if (!driftSplines) {
+ UpdateRunInformations(run);
+ driftSplines = (TObjArray *)fDriftCorrectionArray.At(run);
+ }
+ return driftSplines;
+}
+
AliDCSSensorArray * AliTPCcalibDB::GetVoltageSensors(Int_t run){
//
// Get temperature sensor array
//
// Get the interface to the the vdrift
//
+ if (run>=fVdriftArray.GetEntriesFast()) UpdateRunInformations(run);
AliTPCCalibVdrift * vdrift = (AliTPCCalibVdrift*)fVdriftArray.At(run);
if (!vdrift) {
UpdateRunInformations(run);
return vdrift;
}
+Float_t AliTPCcalibDB::GetCEdriftTime(Int_t run, Int_t sector, Double_t timeStamp, Int_t *entries)
+{
+ //
+ // GetCE drift time information for 'sector'
+ // sector 72 is the mean drift time of the A-Side
+ // sector 73 is the mean drift time of the C-Side
+ // it timestamp==-1 return mean value
+ //
+ AliTPCcalibDB::Instance()->SetRun(run);
+ TGraph *gr=AliTPCcalibDB::Instance()->GetCErocTgraph(sector);
+ if (!gr||sector<0||sector>73) {
+ if (entries) *entries=0;
+ return 0.;
+ }
+ Float_t val=0.;
+ if (timeStamp==-1.){
+ val=gr->GetMean(2);
+ }else{
+ for (Int_t ipoint=0;ipoint<gr->GetN();++ipoint){
+ Double_t x,y;
+ gr->GetPoint(ipoint,x,y);
+ if (x<timeStamp) continue;
+ val=y;
+ break;
+ }
+ }
+ return val;
+}
+
+Float_t AliTPCcalibDB::GetCEchargeTime(Int_t run, Int_t sector, Double_t timeStamp, Int_t *entries)
+{
+ //
+ // GetCE mean charge for 'sector'
+ // it timestamp==-1 return mean value
+ //
+ AliTPCcalibDB::Instance()->SetRun(run);
+ TGraph *gr=AliTPCcalibDB::Instance()->GetCErocQgraph(sector);
+ if (!gr||sector<0||sector>71) {
+ if (entries) *entries=0;
+ return 0.;
+ }
+ Float_t val=0.;
+ if (timeStamp==-1.){
+ val=gr->GetMean(2);
+ }else{
+ for (Int_t ipoint=0;ipoint<gr->GetN();++ipoint){
+ Double_t x,y;
+ gr->GetPoint(ipoint,x,y);
+ if (x<timeStamp) continue;
+ val=y;
+ break;
+ }
+ }
+ return val;
+}
+
Float_t AliTPCcalibDB::GetDCSSensorValue(AliDCSSensorArray *arr, Int_t timeStamp, const char * sensorName, Int_t sigDigits)
{
//
const TString sensorNameString(sensorName);
AliDCSSensor *sensor = arr->GetSensor(sensorNameString);
if (!sensor) return val;
- val=sensor->GetValue(timeStamp);
+ //use the dcs graph if possible
+ TGraph *gr=sensor->GetGraph();
+ if (gr){
+ for (Int_t ipoint=0;ipoint<gr->GetN();++ipoint){
+ Double_t x,y;
+ gr->GetPoint(ipoint,x,y);
+ Int_t time=TMath::Nint(sensor->GetStartTime()+x*3600); //time in graph is hours
+ if (time<timeStamp) continue;
+ val=y;
+ break;
+ }
+ //if val is still 0, test if if the requested time if within 5min of the first/last
+ //data point. If this is the case return the firs/last entry
+ //the timestamps might not be syncronised for all calibration types, sometimes a 'pre'
+ //and 'pos' period is requested. Especially to the HV this is not the case!
+ //first point
+ if (val==0 ){
+ Double_t x,y;
+ gr->GetPoint(0,x,y);
+ Int_t time=TMath::Nint(sensor->GetStartTime()+x*3600); //time in graph is hours
+ if ((time-timeStamp)<5*60) val=y;
+ }
+ //last point
+ if (val==0 ){
+ Double_t x,y;
+ gr->GetPoint(gr->GetN()-1,x,y);
+ Int_t time=TMath::Nint(sensor->GetStartTime()+x*3600); //time in graph is hours
+ if ((timeStamp-time)<5*60) val=y;
+ }
+ } else {
+ val=sensor->GetValue(timeStamp);
+ }
if (sigDigits>=0){
val=(Float_t)TMath::Floor(val * TMath::Power(10., sigDigits) + .5) / TMath::Power(10., sigDigits);
}
const TString sensorNameString(sensorName);
AliDCSSensor *sensor = arr->GetSensor(sensorNameString);
if (!sensor) return val;
-
- //current hack until the spline fit problem is solved
- if (!sensor->GetFit()) return val;
- Int_t nKnots=sensor->GetFit()->GetKnots();
- Double_t tMid=(sensor->GetEndTime()-sensor->GetStartTime())/2.;
- for (Int_t iKnot=0;iKnot<nKnots;++iKnot){
- if (sensor->GetFit()->GetX()[iKnot]>tMid/3600.) break;
- val=(Float_t)sensor->GetFit()->GetY0()[iKnot];
- }
-/*
- TGraph *gr=sensor->MakeGraph();
- if (gr) val=(Float_t)gr->GetMean(2);
- delete gr;
- */
+
+ //use dcs graph if it exists
+ TGraph *gr=sensor->GetGraph();
+ if (gr){
+ val=gr->GetMean(2);
+ } else {
+ //if we don't have the dcs graph, try to get some meaningful information
+ if (!sensor->GetFit()) return val;
+ Int_t nKnots=sensor->GetFit()->GetKnots();
+ Double_t tMid=(sensor->GetEndTime()-sensor->GetStartTime())/2.;
+ for (Int_t iKnot=0;iKnot<nKnots;++iKnot){
+ if (sensor->GetFit()->GetX()[iKnot]>tMid/3600.) break;
+ val=(Float_t)sensor->GetFit()->GetY0()[iKnot];
+ }
+ }
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 {
Float_t AliTPCcalibDB::GetBz(Int_t run){
//
- // calculate BZ from L3 current
+ // calculate BZ in T from L3 current
//
Float_t bz=-1;
Float_t current=AliTPCcalibDB::GetL3Current(run);
- if (current>-1) bz=5*current/30000.;
+ if (current>-1) bz=5*current/30000.*.1;
return bz;
}
//
// get l3 polarity from GRP
//
- return AliTPCcalibDB::GetGRP(run)->GetL3Polarity();
+ Char_t pol=-100;
+ AliGRPObject *grp=AliTPCcalibDB::GetGRP(run);
+ if (grp) pol=grp->GetL3Polarity();
+ return pol;
}
TString AliTPCcalibDB::GetRunType(Int_t run){
//
// return run type from grp
//
- return AliTPCcalibDB::GetGRP(run)->GetRunType();
+
+// TString type("UNKNOWN");
+ AliGRPObject *grp=AliTPCcalibDB::GetGRP(run);
+ if (grp) return grp->GetRunType();
+ return "UNKNOWN";
}
Float_t AliTPCcalibDB::GetValueGoofie(Int_t timeStamp, Int_t run, Int_t type){
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);
return vdrift->GetPTRelative(timeSec,side);
}
-
-void AliTPCcalibDB::ProcessEnv(const char * runList){
- //
- // Example test function - how to use the environment variables
- // runList - ascii file with run numbers
- // output - dcsTime.root file with tree
-
- ifstream in;
- in.open(runList);
- Int_t irun=0;
- TTreeSRedirector *pcstream = new TTreeSRedirector("dcsTime.root");
- while(in.good()) {
- in >> irun;
- if (irun==0) continue;
- printf("Processing run %d\n",irun);
- AliDCSSensor * sensorPressure = AliTPCcalibDB::Instance()->GetPressureSensor(irun);
- if (!sensorPressure) continue;
- AliTPCSensorTempArray * tempArray = AliTPCcalibDB::Instance()->GetTemperatureSensor(irun);
- AliTPCTempMap * tempMap = new AliTPCTempMap(tempArray);
- AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(irun);
- //
- Int_t startTime = sensorPressure->GetStartTime();
- Int_t endTime = sensorPressure->GetEndTime();
- Int_t dtime = TMath::Max((endTime-startTime)/20,10*60);
- for (Int_t itime=startTime; itime<endTime; itime+=dtime){
- //
- TTimeStamp tstamp(itime);
- Float_t valuePressure = sensorPressure->GetValue(tstamp);
-
- TLinearFitter * fitter = 0;
- TVectorD vecTemp[10];
- if (itime<tempArray->GetStartTime().GetSec() || itime>tempArray->GetEndTime().GetSec()){
- }else{
- for (Int_t itype=0; itype<5; itype++)
- for (Int_t iside=0; iside<2; iside++){
- fitter= tempMap->GetLinearFitter(itype,iside,tstamp);
- if (!fitter) continue;
- fitter->Eval(); fitter->GetParameters(vecTemp[itype+iside*5]);
- delete fitter;
- }
- }
-
- TVectorD vecGoofie, vecEntries, vecMean, vecMedian,vecRMS;
- if (goofieArray){
- vecGoofie.ResizeTo(goofieArray->NumSensors());
- ProcessGoofie(goofieArray, vecEntries ,vecMedian, vecMean, vecRMS);
- //
- for (Int_t isensor=0; isensor<goofieArray->NumSensors();isensor++){
- AliDCSSensor *gsensor = goofieArray->GetSensor(isensor);
- if (gsensor){
- vecGoofie[isensor] = gsensor->GetValue(tstamp);
- }
- }
- }
-
-
- //tempMap->GetLinearFitter(0,0,itime);
- (*pcstream)<<"dcs"<<
- "run="<<irun<<
- "time="<<itime<<
- "goofie.="<<&vecGoofie<<
- "goofieE.="<<&vecEntries<<
- "goofieMean.="<<&vecMean<<
- "goofieMedian.="<<&vecMedian<<
- "goofieRMS.="<<&vecRMS<<
- "press="<<valuePressure<<
- "temp00.="<<&vecTemp[0]<<
- "temp10.="<<&vecTemp[1]<<
- "temp20.="<<&vecTemp[2]<<
- "temp30.="<<&vecTemp[3]<<
- "temp40.="<<&vecTemp[4]<<
- "temp01.="<<&vecTemp[5]<<
- "temp11.="<<&vecTemp[6]<<
- "temp21.="<<&vecTemp[7]<<
- "temp31.="<<&vecTemp[8]<<
- "temp41.="<<&vecTemp[9]<<
- "\n";
- }
- }
- delete pcstream;
-}
-
-
-void AliTPCcalibDB::ProcessGoofie( AliDCSSensorArray* goofieArray, TVectorD & vecEntries, TVectorD & vecMedian, TVectorD &vecMean, TVectorD &vecRMS){
- /*
-
- 1 TPC_ANODE_I_A00_STAT
- 2 TPC_DVM_CO2
- 3 TPC_DVM_DriftVelocity
- 4 TPC_DVM_FCageHV
- 5 TPC_DVM_GainFar
- 6 TPC_DVM_GainNear
- 7 TPC_DVM_N2
- 8 TPC_DVM_NumberOfSparks
- 9 TPC_DVM_PeakAreaFar
- 10 TPC_DVM_PeakAreaNear
- 11 TPC_DVM_PeakPosFar
- 12 TPC_DVM_PeakPosNear
- 13 TPC_DVM_PickupHV
- 14 TPC_DVM_Pressure
- 15 TPC_DVM_T1_Over_P
- 16 TPC_DVM_T2_Over_P
- 17 TPC_DVM_T_Over_P
- 18 TPC_DVM_TemperatureS1
- */
- //
- //
- // TVectorD vecMedian; TVectorD vecEntries; TVectorD vecMean; TVectorD vecRMS;
- Double_t kEpsilon=0.0000000001;
- Double_t kBig=100000000000.;
- Int_t nsensors = goofieArray->NumSensors();
- vecEntries.ResizeTo(nsensors);
- vecMedian.ResizeTo(nsensors);
- vecMean.ResizeTo(nsensors);
- vecRMS.ResizeTo(nsensors);
- TVectorF values;
- for (Int_t isensor=0; isensor<goofieArray->NumSensors();isensor++){
- AliDCSSensor *gsensor = goofieArray->GetSensor(isensor);
- if (gsensor && gsensor->GetGraph()){
- Int_t npoints = gsensor->GetGraph()->GetN();
- // filter zeroes
- values.ResizeTo(npoints);
- Int_t nused =0;
- for (Int_t ipoint=0; ipoint<npoints; ipoint++){
- if (TMath::Abs(gsensor->GetGraph()->GetY()[ipoint])>kEpsilon &&
- TMath::Abs(gsensor->GetGraph()->GetY()[ipoint])<kBig ){
- values[nused]=gsensor->GetGraph()->GetY()[ipoint];
- nused++;
- }
- }
- //
- vecEntries[isensor]= nused;
- if (nused>1){
- vecMedian[isensor] = TMath::Median(nused,values.GetMatrixArray());
- vecMean[isensor] = TMath::Mean(nused,values.GetMatrixArray());
- vecRMS[isensor] = TMath::RMS(nused,values.GetMatrixArray());
- }
- }
- }
-}
-
-
-
AliGRPObject * AliTPCcalibDB::MakeGRPObjectFromMap(TMap *map){
//
// Function to covert old GRP run information from TMap to GRPObject
AliGRPObject *grpRun = new AliGRPObject;
grpRun->ReadValuesFromMap(map);
grpRun->SetCavernAtmosPressure(sensor2);
+ grpRun->SetCavernAtmosPressure(sensor2);
grpRun->SetSurfaceAtmosPressure(sensor);
return grpRun;
}
AliTPCcalibDB *db=AliTPCcalibDB::Instance();
// retrieve cal pad objects
db->SetRun(run);
+ db->CreateGUITree(filename);
+ return kTRUE;
+}
+
+Bool_t AliTPCcalibDB::CreateGUITree(const char* filename){
+ //
+ //
+ //
+ if (!AliCDBManager::Instance()->GetDefaultStorage()){
+ AliError("Default Storage not set. Cannot create calibration Tree!");
+ return kFALSE;
+ }
+ UpdateNonRec(); // load all infromation now
+
AliTPCPreprocessorOnline prep;
//noise and pedestals
- prep.AddComponent(db->GetPedestals());
- prep.AddComponent(db->GetPadNoise());
+ if (GetPedestals()) prep.AddComponent(new AliTPCCalPad(*(GetPedestals())));
+ if (GetPadNoise() ) prep.AddComponent(new AliTPCCalPad(*(GetPadNoise())));
//pulser data
- prep.AddComponent(db->GetPulserTmean());
- prep.AddComponent(db->GetPulserTrms());
- prep.AddComponent(db->GetPulserQmean());
+ if (GetPulserTmean()) prep.AddComponent(new AliTPCCalPad(*(GetPulserTmean())));
+ if (GetPulserTrms() ) prep.AddComponent(new AliTPCCalPad(*(GetPulserTrms())));
+ if (GetPulserQmean()) prep.AddComponent(new AliTPCCalPad(*(GetPulserQmean())));
//CE data
- prep.AddComponent(db->GetCETmean());
- prep.AddComponent(db->GetCETrms());
- prep.AddComponent(db->GetCEQmean());
+ if (GetCETmean()) prep.AddComponent(new AliTPCCalPad(*(GetCETmean())));
+ if (GetCETrms() ) prep.AddComponent(new AliTPCCalPad(*(GetCETrms())));
+ if (GetCEQmean()) prep.AddComponent(new AliTPCCalPad(*(GetCEQmean())));
//Altro data
- prep.AddComponent(db->GetALTROAcqStart() );
- prep.AddComponent(db->GetALTROZsThr() );
- prep.AddComponent(db->GetALTROFPED() );
- prep.AddComponent(db->GetALTROAcqStop() );
- prep.AddComponent(db->GetALTROMasked() );
+ if (GetALTROAcqStart() ) prep.AddComponent(new AliTPCCalPad(*(GetALTROAcqStart() )));
+ if (GetALTROZsThr() ) prep.AddComponent(new AliTPCCalPad(*(GetALTROZsThr() )));
+ if (GetALTROFPED() ) prep.AddComponent(new AliTPCCalPad(*(GetALTROFPED() )));
+ if (GetALTROAcqStop() ) prep.AddComponent(new AliTPCCalPad(*(GetALTROAcqStop() )));
+ if (GetALTROMasked() ) prep.AddComponent(new AliTPCCalPad(*(GetALTROMasked() )));
+ //QA
+ AliTPCdataQA *dataQA=GetDataQA();
+ if (dataQA) {
+ if (dataQA->GetNLocalMaxima())
+ prep.AddComponent(new AliTPCCalPad(*(dataQA->GetNLocalMaxima())));
+ if (dataQA->GetMaxCharge())
+ prep.AddComponent(new AliTPCCalPad(*(dataQA->GetMaxCharge())));
+ if (dataQA->GetMeanCharge())
+ prep.AddComponent(new AliTPCCalPad(*(dataQA->GetMeanCharge())));
+ if (dataQA->GetNoThreshold())
+ prep.AddComponent(new AliTPCCalPad(*(dataQA->GetNoThreshold())));
+ if (dataQA->GetNTimeBins())
+ prep.AddComponent(new AliTPCCalPad(*(dataQA->GetNTimeBins())));
+ if (dataQA->GetNPads())
+ prep.AddComponent(new AliTPCCalPad(*(dataQA->GetNPads())));
+ if (dataQA->GetTimePosition())
+ prep.AddComponent(new AliTPCCalPad(*(dataQA->GetTimePosition())));
+ }
+
//
TString file(filename);
- if (file.IsNull()) file=Form("guiTreeRun_%d.root",run);
+ if (file.IsNull()) file=Form("guiTreeRun_%lld.root",fRun);
prep.DumpToFile(file.Data());
return kTRUE;
}
+Bool_t AliTPCcalibDB::CreateRefFile(Int_t run, const char* filename)
+{
+ //
+ // Create a gui tree for run number 'run'
+ //
+
+ if (!AliCDBManager::Instance()->GetDefaultStorage()){
+ AliLog::Message(AliLog::kError, "Default Storage not set. Cannot create Calibration Tree!",
+ MODULENAME(), "AliTPCcalibDB", FUNCTIONNAME(), __FILE__, __LINE__);
+ return kFALSE;
+ }
+ TString file(filename);
+ if (file.IsNull()) file=Form("RefCalPads_%d.root",run);
+ TDirectory *currDir=gDirectory;
+ //db instance
+ AliTPCcalibDB *db=AliTPCcalibDB::Instance();
+ // retrieve cal pad objects
+ db->SetRun(run);
+ //open file
+ TFile f(file.Data(),"recreate");
+ //noise and pedestals
+ db->GetPedestals()->Write("Pedestals");
+ db->GetPadNoise()->Write("PadNoise");
+ //pulser data
+ db->GetPulserTmean()->Write("PulserTmean");
+ db->GetPulserTrms()->Write("PulserTrms");
+ db->GetPulserQmean()->Write("PulserQmean");
+ //CE data
+ db->GetCETmean()->Write("CETmean");
+ db->GetCETrms()->Write("CETrms");
+ db->GetCEQmean()->Write("CEQmean");
+ //Altro data
+ db->GetALTROAcqStart() ->Write("ALTROAcqStart");
+ db->GetALTROZsThr() ->Write("ALTROZsThr");
+ db->GetALTROFPED() ->Write("ALTROFPED");
+ db->GetALTROAcqStop() ->Write("ALTROAcqStop");
+ db->GetALTROMasked() ->Write("ALTROMasked");
+ //
+ f.Close();
+ currDir->cd();
+ return kTRUE;
+}
+
+
+
+Double_t AliTPCcalibDB::GetVDriftCorrectionTime(Int_t timeStamp, Int_t run, Int_t /*side*/, Int_t mode){
+ //
+ // Get time dependent drift velocity correction
+ // multiplication factor vd = vdnom *(1+vdriftcorr)
+ // Arguments:
+ // mode determines the algorith how to combine the Laser Track, LaserCE and physics tracks
+ // timestamp - timestamp
+ // run - run number
+ // side - the drift velocity per side (possible for laser and CE)
+ //
+ // Notice - Extrapolation outside of calibration range - using constant function
+ //
+ Double_t result=0;
+ // mode 1 automatic mode - according to the distance to the valid calibration
+ // -
+ Double_t deltaP=0, driftP=0, wP = 0.;
+ Double_t deltaITS=0,driftITS=0, wITS= 0.;
+ Double_t deltaLT=0, driftLT=0, wLT = 0.;
+ Double_t deltaCE=0, driftCE=0, wCE = 0.;
+ driftP = fDButil->GetVDriftTPC(deltaP,run,timeStamp);
+ driftITS= fDButil->GetVDriftTPCITS(deltaITS,run,timeStamp);
+ driftCE = fDButil->GetVDriftTPCCE(deltaCE, run,timeStamp,36000,2);
+ driftLT = fDButil->GetVDriftTPCLaserTracks(deltaLT,run,timeStamp,36000,2);
+ deltaITS = TMath::Abs(deltaITS);
+ deltaP = TMath::Abs(deltaP);
+ deltaLT = TMath::Abs(deltaLT);
+ deltaCE = TMath::Abs(deltaCE);
+ 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);
+ wCE = 1. *kdeltaT/(deltaCE +kdeltaT);
+ //
+ //
+ if (TMath::Abs(driftP)<kEpsilon) wP=0; // invalid calibration
+ if (TMath::Abs(driftITS)<kEpsilon)wITS=0; // invalid calibration
+ if (TMath::Abs(driftLT)<kEpsilon) wLT=0; // invalid calibration
+ 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;
+}
+
+Double_t AliTPCcalibDB::GetTime0CorrectionTime(Int_t timeStamp, Int_t run, Int_t /*side*/, Int_t mode){
+ //
+ // Get time dependent time 0 (trigger delay in cm) correction
+ // additive correction time0 = time0+ GetTime0CorrectionTime
+ // Value etracted combining the vdrift correction using laser tracks and CE and the physics track matchin
+ // Arguments:
+ // mode determines the algorith how to combine the Laser Track and physics tracks
+ // timestamp - timestamp
+ // run - run number
+ // side - the drift velocity per side (possible for laser and CE)
+ //
+ // Notice - Extrapolation outside of calibration range - using constant function
+ //
+ Double_t result=0;
+ if (mode==2) {
+ // TPC-TPC mode
+ result=fDButil->GetTriggerOffsetTPC(run,timeStamp);
+ result *=fParam->GetZLength();
+ }
+ if (mode==1){
+ // TPC-ITS mode
+ Double_t dist=0;
+ result= -fDButil->GetTime0TPCITS(dist, run, timeStamp)*fParam->GetDriftV()/1000000.;
+ }
+ return result;
+
+}
+
+
+
+
+Double_t AliTPCcalibDB::GetVDriftCorrectionGy(Int_t timeStamp, Int_t run, Int_t side, Int_t /*mode*/){
+ //
+ // 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 or TPC-ITS
+ // Arguments:
+ // 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)
+ //
+ // Notice - Extrapolation outside of calibration range - using constant function
+ //
+ if (run<=0 && fTransform) run = fTransform->GetCurrentRunNumber();
+ 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");
+
+ if (laserA && laserC){
+ result= (laserA->Eval(timeStamp)+laserC->Eval(timeStamp))*0.5;
+ }
+ if (laserA && side==0){
+ result = (laserA->Eval(timeStamp));
+ }
+ if (laserC &&side==1){
+ result = (laserC->Eval(timeStamp));
+ }
+ //printf("laser result %e \n", -result/250.);
+
+ return -result/250.; //normalized before
+}
+
+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) {
+ snprintf(chinfo,1000,"Failed to get mapping object from %s. ...\n", nameMappingFile);
+ AliError (chinfo);
+ return 0;
+ }
+
+ AliTPCCalPad *deadMap = new AliTPCCalPad("deadMap","deadMap");
+ if (!deadMap) {
+ AliError("Failed to allocate dead map AliTPCCalPad");
+ return 0;
+ }
+
+ /// get list of active DDLs from OCDB entry
+ Int_t idDDL=0;
+ if (!fALTROConfigData ) {
+ AliError("No ALTRO config OCDB entry available");
+ return 0;
+ }
+ TMap *activeDDL = (TMap*)fALTROConfigData->FindObject("DDLArray");
+ TObjString *ddlArray=0;
+ if (activeDDL) {
+ ddlArray = (TObjString*)activeDDL->GetValue("DDLArray");
+ if (!ddlArray) {
+ AliError("Empty list of active DDLs in OCDB entry");
+ return 0;
+ }
+ } else {
+ AliError("List of active DDLs not available in OCDB entry");
+ return 0;
+ }
+ TString arrDDL=ddlArray->GetString();
+ Int_t offset = mapping->GetTpcDdlOffset();
+ 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++ ) {
+ for ( Int_t fec = 0; fec < mapping->GetNfec(patch, branch); fec++ ) {
+ for ( Int_t altro = 0; altro < 8; altro++ ) {
+ for ( Int_t channel = 0; channel < 16; channel++ ) {
+ Int_t hwadd = mapping->CodeHWAddress(branch, fec, altro, channel);
+ 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);
+ 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
+ } // end fec for loop
+ } // end branch for loop
+ } // valid calROC
+ } // end loop on active DDLs
+ return deadMap;
+}
+
+
+
+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); //
+}
+