#include "TF1.h"
#include "TFile.h"
#include "TH1F.h"
#include "TH1C.h"
#include "TH2F.h"
#include "TTree.h"
#include "TChain.h"
#include "TProfile.h"
#include "TGrid.h"
#include "TMath.h"
#include "TMap.h"
#include "AliCDBEntry.h"
#include "AliCDBRunRange.h"
#include "AliCDBId.h"
#include "AliCDBManager.h"
#include "AliCDBStorage.h"
#include "AliCDBMetaData.h"
#include "AliLog.h"
#include "AliTOFcalib.h"
#include "AliTOFChannelOnlineArray.h"
#include "AliTOFChannelOnline.h"
#include "AliTOFChannelOnlineStatus.h"
#include "AliTOFChannelOnlineStatusArray.h"
#include "AliTOFChannelOffline.h"
#include "AliTOFGeometry.h"
#include "AliTOFRecoParam.h"
#include "AliTOFDeltaBCOffset.h"
#include "AliTOFCTPLatency.h"
#include "AliTOFT0Fill.h"
#include "AliTOFRunParams.h"
#include "AliLHCClockPhase.h"
#include "AliTOFResponseParams.h"
#include "AliESDEvent.h"
#include "AliESDtrack.h"
#include "TRandom.h"
class TROOT;
class TStyle;
extern TStyle *gStyle;
ClassImp(AliTOFcalib)
AliTOFcalib::AliTOFcalib():
TTask("AliTOFcalib",""),
fNChannels(-1),
fTOFCalOnline(0x0),
fTOFCalOnlinePulser(0x0),
fTOFCalOnlineNoise(0x0),
fTOFCalOnlineHW(0x0),
fTOFCalOffline(0x0),
fCal(0x0),
fStatus(0x0),
fTOFSimToT(0x0),
fkValidity(0x0),
fTree(0x0),
fChain(0x0),
fNruns(0),
fFirstRun(0),
fLastRun(AliCDBRunRange::Infinity()),
fConfigMap(new TMap),
fDeltaBCOffset(NULL),
fCTPLatency(NULL),
fT0Fill(NULL),
fRunParams(NULL),
fLHCClockPhase(NULL),
fResponseParams(NULL),
fReadoutEfficiency(NULL),
fProblematic(NULL),
fInitFlag(kFALSE),
fRemoveMeanT0(kTRUE),
fUseLHCClockPhase(kFALSE),
fCalibrateTOFsignal(kTRUE),
fCorrectTExp(kFALSE),
fRunParamsSpecificVersion(-1)
{
fNChannels = AliTOFGeometry::NSectors()*(2*(AliTOFGeometry::NStripC()+AliTOFGeometry::NStripB())+AliTOFGeometry::NStripA())*AliTOFGeometry::NpadZ()*AliTOFGeometry::NpadX();
gRandom->SetSeed(123456789);
}
AliTOFcalib::AliTOFcalib(const AliTOFcalib & calib):
TTask(calib),
fNChannels(calib.fNChannels),
fTOFCalOnline(0x0),
fTOFCalOnlinePulser(0x0),
fTOFCalOnlineNoise(0x0),
fTOFCalOnlineHW(0x0),
fTOFCalOffline(0x0),
fCal(calib.fCal),
fStatus(calib.fStatus),
fTOFSimToT(calib.fTOFSimToT),
fkValidity(calib.fkValidity),
fTree(calib.fTree),
fChain(calib.fChain),
fNruns(calib.fNruns),
fFirstRun(calib.fFirstRun),
fLastRun(calib.fLastRun),
fConfigMap(calib.fConfigMap),
fDeltaBCOffset(NULL),
fCTPLatency(NULL),
fT0Fill(NULL),
fRunParams(NULL),
fLHCClockPhase(NULL),
fResponseParams(NULL),
fReadoutEfficiency(NULL),
fProblematic(NULL),
fInitFlag(calib.fInitFlag),
fRemoveMeanT0(calib.fRemoveMeanT0),
fUseLHCClockPhase(calib.fUseLHCClockPhase),
fCalibrateTOFsignal(calib.fCalibrateTOFsignal),
fCorrectTExp(calib.fCorrectTExp),
fRunParamsSpecificVersion(calib.fRunParamsSpecificVersion)
{
fTOFCalOnline = new TObjArray(fNChannels);
fTOFCalOnlinePulser = new TObjArray(fNChannels);
fTOFCalOnlineNoise = new TObjArray(fNChannels);
fTOFCalOnlineHW = new TObjArray(fNChannels);
fTOFCalOffline = new TObjArray(fNChannels);
fTOFCalOnline->SetOwner();
fTOFCalOnlinePulser->SetOwner();
fTOFCalOnlineNoise->SetOwner();
fTOFCalOnlineHW->SetOwner();
fTOFCalOffline->SetOwner();
for (Int_t iarray = 0; iarray<fNChannels; iarray++){
AliTOFChannelOnline * calChOnline = (AliTOFChannelOnline*)calib.fTOFCalOnline->At(iarray);
AliTOFChannelOnlineStatus * calChOnlineStPulser = (AliTOFChannelOnlineStatus*)calib.fTOFCalOnlinePulser->At(iarray);
AliTOFChannelOnlineStatus * calChOnlineStNoise = (AliTOFChannelOnlineStatus*)calib.fTOFCalOnlineNoise->At(iarray);
AliTOFChannelOnlineStatus * calChOnlineStHW = (AliTOFChannelOnlineStatus*)calib.fTOFCalOnlineHW->At(iarray);
AliTOFChannelOffline * calChOffline = (AliTOFChannelOffline*)calib.fTOFCalOffline->At(iarray);
fTOFCalOnline->AddAt(calChOnline,iarray);
fTOFCalOnlinePulser->AddAt(calChOnlineStPulser,iarray);
fTOFCalOnlineNoise->AddAt(calChOnlineStNoise,iarray);
fTOFCalOnlineHW->AddAt(calChOnlineStHW,iarray);
fTOFCalOffline->AddAt(calChOffline,iarray);
}
if (calib.fDeltaBCOffset) fDeltaBCOffset = new AliTOFDeltaBCOffset(*calib.fDeltaBCOffset);
if (calib.fCTPLatency) fCTPLatency = new AliTOFCTPLatency(*calib.fCTPLatency);
if (calib.fT0Fill) fT0Fill = new AliTOFT0Fill(*calib.fT0Fill);
if (calib.fRunParams) fRunParams = new AliTOFRunParams(*calib.fRunParams);
if (calib.fResponseParams) fResponseParams = new AliTOFResponseParams(*calib.fResponseParams);
if (calib.fReadoutEfficiency) fReadoutEfficiency = new TH1F(*calib.fReadoutEfficiency);
if (calib.fProblematic) fProblematic = new TH1C(*calib.fProblematic);
gRandom->SetSeed(123456789);
}
AliTOFcalib& AliTOFcalib::operator=(const AliTOFcalib &calib)
{
if (this == &calib)
return *this;
TTask::operator=(calib);
fNChannels = calib.fNChannels;
fCal = calib.fCal;
fStatus = calib.fStatus;
fTOFSimToT = calib.fTOFSimToT;
fkValidity = calib.fkValidity;
fTree = calib.fTree;
fChain = calib.fChain;
fNruns = calib.fNruns;
fFirstRun = calib.fFirstRun;
fLastRun = calib.fLastRun;
for (Int_t iarray = 0; iarray<fNChannels; iarray++){
AliTOFChannelOnline * calChOnline = (AliTOFChannelOnline*)calib.fTOFCalOnline->At(iarray);
AliTOFChannelOffline * calChOffline = (AliTOFChannelOffline*)calib.fTOFCalOffline->At(iarray);
AliTOFChannelOnlineStatus * calChOnlineStPulser = (AliTOFChannelOnlineStatus*)calib.fTOFCalOnlinePulser->At(iarray);
AliTOFChannelOnlineStatus * calChOnlineStNoise = (AliTOFChannelOnlineStatus*)calib.fTOFCalOnlineNoise->At(iarray);
AliTOFChannelOnlineStatus * calChOnlineStHW = (AliTOFChannelOnlineStatus*)calib.fTOFCalOnlineHW->At(iarray);
fTOFCalOnline->AddAt(calChOnline,iarray);
fTOFCalOnlinePulser->AddAt(calChOnlineStPulser,iarray);
fTOFCalOnlineNoise->AddAt(calChOnlineStNoise,iarray);
fTOFCalOnlineHW->AddAt(calChOnlineStHW,iarray);
fTOFCalOffline->AddAt(calChOffline,iarray);
}
if (calib.fDeltaBCOffset) {
if (fDeltaBCOffset) *fDeltaBCOffset = *calib.fDeltaBCOffset;
else fDeltaBCOffset = new AliTOFDeltaBCOffset(*calib.fDeltaBCOffset);
}
if (calib.fCTPLatency) {
if (fCTPLatency) *fCTPLatency = *calib.fCTPLatency;
else fCTPLatency = new AliTOFCTPLatency(*calib.fCTPLatency);
}
if (calib.fT0Fill) {
if (fT0Fill) *fT0Fill = *calib.fT0Fill;
else fT0Fill = new AliTOFT0Fill(*calib.fT0Fill);
}
if (calib.fRunParams) {
if (fRunParams) *fRunParams = *calib.fRunParams;
else fRunParams = new AliTOFRunParams(*calib.fRunParams);
}
if (calib.fResponseParams) {
if (fResponseParams) *fResponseParams = *calib.fResponseParams;
else fResponseParams = new AliTOFResponseParams(*calib.fResponseParams);
}
if (calib.fReadoutEfficiency) {
if (fReadoutEfficiency) *fReadoutEfficiency = *calib.fReadoutEfficiency;
else fReadoutEfficiency = new TH1F(*calib.fReadoutEfficiency);
}
if (calib.fProblematic) {
if (fProblematic) *fProblematic = *calib.fProblematic;
else fProblematic = new TH1C(*calib.fProblematic);
}
fInitFlag = calib.fInitFlag;
fRemoveMeanT0 = calib.fRemoveMeanT0;
fUseLHCClockPhase = calib.fUseLHCClockPhase;
fCalibrateTOFsignal = calib.fCalibrateTOFsignal;
fCorrectTExp = calib.fCorrectTExp;
fRunParamsSpecificVersion = calib.fRunParamsSpecificVersion;
return *this;
}
AliTOFcalib::~AliTOFcalib()
{
if(!(AliCDBManager::Instance()->GetCacheFlag())){
if (fTOFCalOnline){
delete fTOFCalOnline;
}
if (fTOFCalOnlinePulser){
delete fTOFCalOnlinePulser;
}
if (fTOFCalOnlineNoise){
delete fTOFCalOnlineNoise;
}
if (fTOFCalOnlineHW){
delete fTOFCalOnlineHW;
}
if (fTOFCalOffline){
delete fTOFCalOffline;
}
if (fCal){
delete fCal;
}
if (fStatus){
delete fStatus;
}
if (fConfigMap){
delete fConfigMap;
}
if (fDeltaBCOffset) delete fDeltaBCOffset;
if (fCTPLatency) delete fCTPLatency;
if (fT0Fill) delete fT0Fill;
if (fRunParams) delete fRunParams;
if (fResponseParams) delete fResponseParams;
if (fReadoutEfficiency) delete fReadoutEfficiency;
if (fProblematic) delete fProblematic;
}
if (fTree!=0x0) delete fTree;
if (fChain!=0x0) delete fChain;
}
void AliTOFcalib::CreateCalArrays(){
fTOFCalOnline = new TObjArray(fNChannels);
fTOFCalOnlinePulser = new TObjArray(fNChannels);
fTOFCalOnlineNoise = new TObjArray(fNChannels);
fTOFCalOnlineHW = new TObjArray(fNChannels);
fTOFCalOffline = new TObjArray(fNChannels);
fTOFCalOnline->SetOwner();
fTOFCalOnlinePulser->SetOwner();
fTOFCalOnlineNoise->SetOwner();
fTOFCalOnlineHW->SetOwner();
fTOFCalOffline->SetOwner();
for (Int_t iarray = 0; iarray<fNChannels; iarray++){
AliTOFChannelOnline * calChOnline = new AliTOFChannelOnline();
AliTOFChannelOnlineStatus * calChOnlineStPulser = new AliTOFChannelOnlineStatus();
AliTOFChannelOnlineStatus * calChOnlineStNoise = new AliTOFChannelOnlineStatus();
AliTOFChannelOnlineStatus * calChOnlineStHW = new AliTOFChannelOnlineStatus();
AliTOFChannelOffline * calChOffline = new AliTOFChannelOffline();
fTOFCalOnline->AddAt(calChOnline,iarray);
fTOFCalOnlinePulser->AddAt(calChOnlineStPulser,iarray);
fTOFCalOnlineNoise->AddAt(calChOnlineStNoise,iarray);
fTOFCalOnlineHW->AddAt(calChOnlineStHW,iarray);
fTOFCalOffline->AddAt(calChOffline,iarray);
}
fCal = new AliTOFChannelOnlineArray(fNChannels);
fStatus = new AliTOFChannelOnlineStatusArray(fNChannels);
}
void AliTOFcalib::CreateCalObjects(){
fTOFCalOffline = new TObjArray(fNChannels);
fTOFCalOffline->SetOwner();
for (Int_t iarray = 0; iarray<fNChannels; iarray++){
AliTOFChannelOffline * calChOffline = new AliTOFChannelOffline();
fTOFCalOffline->AddAt(calChOffline,iarray);
}
fCal = new AliTOFChannelOnlineArray(fNChannels);
fStatus = new AliTOFChannelOnlineStatusArray(fNChannels);
}
void AliTOFcalib::WriteConfigMapOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun)
{
SetFirstRun(minrun);
SetLastRun(maxrun);
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Config" ;
TString out(Form("%s/%s",sel,sel1));
AliDebug(2,Form("Writing TOF configuration map for online calib on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
AliCDBId id(out,fFirstRun,fLastRun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fConfigMap) {
}
man->Put(fConfigMap,id,md);
delete md;
}
void AliTOFcalib::WriteConfigMapOnCDB(const Char_t *sel)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Config" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBRunRange runrange(fFirstRun,fLastRun);
AliDebug(2,Form("Writing TOF config map for online calib on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
AliCDBId id(out,runrange);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fConfigMap) {
}
man->Put(fConfigMap,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlineDelayOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun)
{
SetFirstRun(minrun);
SetLastRun(maxrun);
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "ParOnlineDelay" ;
TString out(Form("%s/%s",sel,sel1));
AliDebug(2,Form("Writing TOF online calib obj on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
AliCDBId id(out,fFirstRun,fLastRun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fCal) {
}
man->Put(fCal,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlineStatusOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun)
{
SetFirstRun(minrun);
SetLastRun(maxrun);
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Status" ;
TString out(Form("%s/%s",sel,sel1));
AliDebug(2,Form("Writing TOF online status calib obj on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
AliCDBId id(out,fFirstRun,fLastRun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fStatus) {
}
man->Put(fStatus,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlineDelayOnCDB(const Char_t *sel)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "ParOnlineDelay" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBRunRange runrange(fFirstRun,fLastRun);
AliDebug(2,Form("Writing TOF online calib obj on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
AliCDBId id(out,runrange);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fCal) {
}
man->Put(fCal,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlineStatusOnCDB(const Char_t *sel)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Status" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBRunRange runrange(fFirstRun,fLastRun);
AliDebug(2,Form("Writing TOF online status calib obj on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
AliCDBId id(out,runrange);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fStatus) {
}
man->Put(fStatus,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlineOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun)
{
SetFirstRun(minrun);
SetLastRun(maxrun);
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "ParOnline" ;
TString out(Form("%s/%s",sel,sel1));
AliDebug(2,Form("Writing TOF online calib obj on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
AliCDBId id(out,fFirstRun,fLastRun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fTOFCalOnline) {
}
man->Put(fTOFCalOnline,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlinePulserOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun)
{
SetFirstRun(minrun);
SetLastRun(maxrun);
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Pulser" ;
TString out(Form("%s/%s",sel,sel1));
AliDebug(2,Form("Writing TOF online calib obj from pulser on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
AliCDBId id(out,fFirstRun,fLastRun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fTOFCalOnlinePulser) {
}
man->Put(fTOFCalOnlinePulser,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlineNoiseOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun)
{
SetFirstRun(minrun);
SetLastRun(maxrun);
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Noise" ;
TString out(Form("%s/%s",sel,sel1));
AliDebug(2,Form("Writing TOF online calib obj from noise on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
AliCDBId id(out,fFirstRun,fLastRun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fTOFCalOnlineNoise) {
}
man->Put(fTOFCalOnlineNoise,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlineHWOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun)
{
SetFirstRun(minrun);
SetLastRun(maxrun);
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "HW" ;
TString out(Form("%s/%s",sel,sel1));
AliDebug(2,Form("Writing TOF online calib obj from hardware on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
AliCDBId id(out,fFirstRun,fLastRun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fTOFCalOnlineHW) {
}
man->Put(fTOFCalOnlineHW,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlineOnCDB(const Char_t *sel)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "ParOnline" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBRunRange runrange(fFirstRun,fLastRun);
AliDebug(2,Form("Writing TOF online calib obj on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
AliCDBId id(out,runrange);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fTOFCalOnline) {
}
man->Put(fTOFCalOnline,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlinePulserOnCDB(const Char_t *sel)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Pulser" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBRunRange runrange(fFirstRun,fLastRun);
AliDebug(2,Form("Writing TOF online calib obj from pulser on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
AliCDBId id(out,runrange);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fTOFCalOnlinePulser) {
}
man->Put(fTOFCalOnlinePulser,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlineNoiseOnCDB(const Char_t *sel)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Noise" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBRunRange runrange(fFirstRun,fLastRun);
AliDebug(2,Form("Writing TOF online calib obj from noise on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
AliCDBId id(out,runrange);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fTOFCalOnlineNoise) {
}
man->Put(fTOFCalOnlineNoise,id,md);
delete md;
}
void AliTOFcalib::WriteParOnlineHWOnCDB(const Char_t *sel)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "HW" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBRunRange runrange(fFirstRun,fLastRun);
AliDebug(2,Form("Writing TOF online calib obj from harware on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
AliCDBId id(out,runrange);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
if (!fTOFCalOnlineHW) {
}
man->Put(fTOFCalOnlineHW,id,md);
delete md;
}
void AliTOFcalib::WriteParOfflineOnCDB(const Char_t *sel, const Char_t *validity, Int_t minrun, Int_t maxrun)
{
SetFirstRun(minrun);
SetLastRun(maxrun);
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "ParOffline" ;
TString out(Form("%s/%s",sel,sel1));
AliDebug(2,Form("Writing TOF offline calib obj on CDB with run range [%i, %i] ",fFirstRun,fLastRun));
AliCDBId id(out,fFirstRun,fLastRun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
md->SetComment(validity);
man->Put(fTOFCalOffline,id,md);
delete md;
}
void AliTOFcalib::WriteParOfflineOnCDB(const Char_t *sel, const Char_t *validity)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "ParOffline" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBRunRange runrange(fFirstRun,fLastRun);
AliDebug(2,Form("Writing TOF offline calib obj on CDB with run range [%i, %i] ",runrange.GetFirstRun(),runrange.GetLastRun()));
AliCDBId id(out,runrange);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Chiara Zampolli");
md->SetComment(validity);
man->Put(fTOFCalOffline,id,md);
delete md;
}
Bool_t AliTOFcalib::ReadConfigMapFromCDB(const Char_t *sel, Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Config" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBEntry *entry = man->Get(out,nrun);
if (!entry) {
AliFatal("Exiting, no CDB object (ConfigMap) found!!!");
exit(0);
}
if(!entry->GetObject()){
AliFatal("Exiting, no CDB object (ConfigMap) found!!!");
exit(0);
}
fConfigMap =(TMap*)entry->GetObject();
return kTRUE;
}
Bool_t AliTOFcalib::ReadParOnlineDelayFromCDB(const Char_t *sel, Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "ParOnlineDelay" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBEntry *entry = man->Get(out,nrun);
if (!entry) {
AliFatal("Exiting, no CDB object (ParOnlineDelay) found!!!");
exit(0);
}
if(!entry->GetObject()){
AliFatal("Exiting, no CDB object (ParOnlineDelay) found!!!");
exit(0);
}
fCal =(AliTOFChannelOnlineArray*)entry->GetObject();
return kTRUE;
}
Bool_t AliTOFcalib::ReadParOnlineStatusFromCDB(const Char_t *sel, Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Status" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBEntry *entry = man->Get(out,nrun);
if (!entry) {
AliFatal("Exiting, no CDB object (Status) found!!!");
exit(0);
}
if(!entry->GetObject()){
AliFatal("Exiting, no CDB object (Status) found!!!");
exit(0);
}
fStatus =(AliTOFChannelOnlineStatusArray*)entry->GetObject();
return kTRUE;
}
Bool_t AliTOFcalib::ReadParOnlineFromCDB(const Char_t *sel, Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "ParOnline" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBEntry *entry = man->Get(out,nrun);
if (!entry) {
AliFatal("Exiting, no CDB object (ParOnline) found!!!");
exit(0);
}
if(!entry->GetObject()){
AliFatal("Exiting, no CDB object (ParOnline) found!!!");
exit(0);
}
fTOFCalOnline =(TObjArray*)entry->GetObject();
return kTRUE;
}
Bool_t AliTOFcalib::ReadParOnlinePulserFromCDB(const Char_t *sel, Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Pulser" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBEntry *entry = man->Get(out,nrun);
if (!entry) {
AliFatal("Exiting, no CDB object (Pulser) found!!!");
exit(0);
}
if(!entry->GetObject()){
AliFatal("Exiting, no CDB object (Pulser) found!!!");
exit(0);
}
fTOFCalOnlinePulser =(TObjArray*)entry->GetObject();
return kTRUE;
}
Bool_t AliTOFcalib::ReadParOnlineNoiseFromCDB(const Char_t *sel, Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "Noise" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBEntry *entry = man->Get(out,nrun);
if (!entry) {
AliFatal("Exiting, no CDB object (Noise) found!!!");
exit(0);
}
if(!entry->GetObject()){
AliFatal("Exiting, no CDB object (Noise) found!!!");
exit(0);
}
fTOFCalOnlineNoise =(TObjArray*)entry->GetObject();
return kTRUE;
}
Bool_t AliTOFcalib::ReadParOnlineHWFromCDB(const Char_t *sel, Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "HW" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBEntry *entry = man->Get(out,nrun);
if (!entry) {
AliFatal("Exiting, no CDB object (HW map) found!!!");
exit(0);
}
if(!entry->GetObject()){
AliFatal("Exiting, no CDB object (HW map) found!!!");
exit(0);
}
fTOFCalOnlineHW =(TObjArray*)entry->GetObject();
return kTRUE;
}
Bool_t AliTOFcalib::ReadParOfflineFromCDB(const Char_t *sel, Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "ParOffline" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBEntry *entry = man->Get(out,nrun);
if (!entry) {
AliFatal("Exiting, no CDB object (ParOffline) found!!!");
exit(0);
}
if(!entry->GetObject()){
AliFatal("Exiting, no CDB object (ParOffline) found!!!");
exit(0);
}
AliCDBMetaData * md = entry->GetMetaData();
fkValidity = md->GetComment();
fTOFCalOffline =(TObjArray*)entry->GetObject();
return kTRUE;
}
void AliTOFcalib::WriteSimHistoOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun, TH1F *histo){
fTOFSimToT=histo;
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "SimHisto" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBMetaData *mdhisto = new AliCDBMetaData();
mdhisto->SetResponsible("Chiara Zampolli");
AliCDBId id(out,minrun,maxrun);
man->Put(fTOFSimToT,id,mdhisto);
delete mdhisto;
}
Bool_t AliTOFcalib::ReadSimHistoFromCDB(const Char_t *sel, Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "SimHisto" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBEntry *entry = man->Get(out,nrun);
if (!entry) {
AliFatal("Exiting, no CDB object (SimHisto) found!!!");
exit(0);
}
if(!entry->GetObject()){
AliFatal("Exiting, no CDB object (SimHisto) found!!!");
exit(0);
}
TH1F *histo =(TH1F*)entry->GetObject();
fTOFSimToT=histo;
return kTRUE;
}
void AliTOFcalib::WriteRecParOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun, AliTOFRecoParam *param){
AliCDBManager *man = AliCDBManager::Instance();
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Silvia Arcelli");
const Char_t *sel1 = "RecoParam" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBId id(out,minrun,maxrun);
TObjArray *arr=new TObjArray(1);
arr->AddLast(param);
man->Put(arr,id,md);
delete md;
}
void AliTOFcalib::WriteRecParOnCDB(const Char_t *sel, Int_t minrun, Int_t maxrun, TObjArray *arr){
AliCDBManager *man = AliCDBManager::Instance();
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Silvia Arcelli");
const Char_t *sel1 = "RecoParam" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBId id(out,minrun,maxrun);
man->Put(arr,id,md);
delete md;
}
AliTOFRecoParam * AliTOFcalib::ReadRecParFromCDB(const Char_t *sel, Int_t nrun, Int_t eventType)
{
AliCDBManager *man = AliCDBManager::Instance();
const Char_t *sel1 = "RecoParam" ;
TString out(Form("%s/%s",sel,sel1));
AliCDBEntry *entry = man->Get(out,nrun);
if (!entry) {
AliFatal("Exiting, no CDB object (RecoParam) found!!!");
exit(0);
}
if(!entry->GetObject()){
AliFatal("Exiting, no CDB object (RecoParam) found!!!");
exit(0);
}
TObjArray *array = (TObjArray*)entry->GetObject();
AliTOFRecoParam *param=0x0;
if (eventType>=0 || eventType<array->GetEntries())
param=(AliTOFRecoParam*)array->At(eventType);
return param;
}
void AliTOFcalib::CreateTreeFromCDB(Int_t minrun, Int_t maxrun){
Float_t p[CHENTRIESSMALL];
Int_t nentries;
fTree = new TTree("TOFCalib","Tree for TOF Calibration");
fTree->Branch("nentries",&nentries,"nentries/I");
fTree->Branch("TOFentries",p,"TOFentries[nentries]/F");
AliCDBManager *man = AliCDBManager::Instance();
AliCDBStorage *aStorage = man->GetStorage("local://$ALICE_ROOT/OCDB");
for (Int_t irun = minrun;irun<=maxrun;irun++){
AliCDBEntry *entry = aStorage->Get("TOF/RefData/TreeForCalib",irun);
if (!entry){
AliInfo(Form("No entry found for run %i",irun));
}
else{
TTree *tree = (TTree*)entry->GetObject();
tree->SetBranchAddress("nentries",&nentries);
tree->SetBranchAddress("TOFentries",p);
fTree->CopyEntries(tree);
fNruns++;
}
}
AliInfo(Form("Number of runs being analyzed %i",fNruns));
}
void AliTOFcalib::CreateTreeFromGrid(Int_t minrun, Int_t maxrun){
Float_t p[CHENTRIESSMALL];
Int_t nentries;
fTree = new TTree("TOFCalib","Tree for TOF Calibration");
fTree->SetDirectory(0);
fTree->Branch("nentries",&nentries,"nentries/I");
fTree->Branch("TOFentries",p,"TOFentries[nentries]/F");
AliInfo("connected to alien");
TGrid::Connect("alien://");
TString filename;
for (Int_t irun = minrun;irun<=maxrun;irun++){
filename = Form("alien:///alice/cern.ch/user/c/czampolli/TOFCalibReference_%i.root",irun);
TFile *filegrid = TFile::Open(filename.Data(),"READ");
TTree *tree = (TTree*)filegrid->Get("T");
tree->SetBranchAddress("nentries",&nentries);
tree->SetBranchAddress("TOFentries",p);
fTree->CopyEntries(tree);
delete tree;
fNruns++;
}
AliInfo(Form("Number of runs being analyzed %i",fNruns));
}
void AliTOFcalib::CreateTreeFromFile(Int_t minrun, Int_t maxrun){
Float_t p[CHENTRIESSMALL];
Int_t nentries;
fTree = new TTree("TOFCalib","Tree for TOF Calibration");
fTree->SetDirectory(0);
fTree->Branch("nentries",&nentries,"nentries/I");
fTree->Branch("TOFentries",p,"TOFentries[nentries]/F");
TString filename;
for (Int_t irun = minrun;irun<=maxrun;irun++){
filename = Form("$ALICE_ROOT/TOF/RefData/TreeForCalib/fileout_%i.root",irun);
TFile *file = new TFile(filename.Data(),"READ");
TTree *tree = (TTree*)file->Get("T");
tree->SetBranchAddress("nentries",&nentries);
tree->SetBranchAddress("TOFentries",p);
fTree->CopyEntries(tree);
delete tree;
delete file;
file = 0x0;
fNruns++;
}
AliInfo(Form("Number of runs being analyzed %i",fNruns));
}
void AliTOFcalib::CreateChainFromGrid(Int_t minrun, Int_t maxrun){
fChain = new TChain("T");
AliInfo("connected to alien");
TGrid::Connect("alien://");
TString filename;
for (Int_t irun = minrun;irun<=maxrun;irun++){
filename = Form("alien:///alice/cern.ch/user/c/czampolli/TOFCalibReference_%i.root",irun);
fChain->Add(filename.Data());
fNruns++;
}
AliInfo(Form("Number of runs being analyzed %i",fNruns));
}
Int_t AliTOFcalib::Calibrate(Int_t ichmin, Int_t ichmax, Option_t *optionSave, Option_t *optionFit){
TH1::AddDirectory(0);
AliInfo(Form("*** Calibrating Histograms %s, summing more channels, from channel %i, to channel %i, storing Calib Pars in channel %i", GetName(),ichmin,ichmax,ichmin)) ;
AliInfo(Form("Option for Saving histos = %s",optionSave )) ;
AliInfo(Form("Option for Fitting Profile histos = %s",optionFit )) ;
Float_t p[CHENTRIESSMALL];
Int_t nentries;
fChain->SetBranchAddress("nentries",&nentries);
fChain->SetBranchAddress("TOFentries",p);
Float_t ntracksTotalmean =0;
for (Int_t i=ichmin; i<ichmax; i++){
Int_t ientry = -1;
for (Int_t irun=0;irun<fNruns;irun++){
ientry = i+irun*fNChannels;
fChain->GetEntry(ientry);
Int_t ntracksRun=nentries/3;
ntracksTotalmean+=ntracksRun;
}
}
if (ntracksTotalmean < MEANENTRIES) {
AliInfo(Form(" Too small mean number of entires per channel (mean number = %f) not calibrating and exiting.....",ntracksTotalmean));
return 2;
}
Int_t nbinToT = 100;
Float_t minToT = 0;
Float_t maxToT = 4.88;
TH1F *hToT = new TH1F("htot","htot",nbinToT, minToT, maxToT);
TH1F *hdeltaTime = new TH1F("hdeltaTime","hdeltaTime",200,2,4);
Int_t ntracksTotal = 0;
Int_t ntracksRun = 0;
Double_t binsProfile[101];
Int_t nusefulbins=0;
Float_t meantime=0;
for (Int_t i = ichmin;i<ichmax;i++){
Int_t ientry = -1;
for (Int_t irun=0;irun<fNruns;irun++){
ientry = i+irun*fNChannels;
fChain->GetEntry(ientry);
ntracksTotal+=nentries/3;
ntracksRun=nentries/3;
AliDebug(2,Form("run %i, channel %i, nentries = %i, ntracks = %i",irun,i,nentries, ntracksRun));
for (Int_t j=0;j<ntracksRun;j++){
Int_t idxexToT = (j* NIDXSMALL)+DELTAIDXTOT;
Int_t idxexTime = (j* NIDXSMALL)+DELTAIDXTIME;
Int_t idxexExTime = (j* NIDXSMALL)+DELTAIDXPID;
Float_t tot = p[idxexToT];
hdeltaTime->Fill(p[idxexTime]-p[idxexExTime]);
meantime+=p[idxexTime]-p[idxexExTime];
hToT->Fill(tot);
}
}
}
nusefulbins = FindBins(hToT,&binsProfile[0]);
if (ntracksTotal != 0){
meantime/=ntracksTotal;
}
AliDebug(2, Form("meantime = %f",meantime));
for (Int_t j=1;j<=nusefulbins;j++) {
AliDebug(2,Form(" summing channels from %i to %i, nusefulbins = %i, bin %i = %f",ichmin,ichmax,nusefulbins,j,binsProfile[j]));
}
TProfile* hSlewingProf = new TProfile("hSlewingProf", "hSlewingProf",nusefulbins, binsProfile, "G");
TH2F * htimetot = new TH2F("htimetot","htimetot",nbinToT, minToT, maxToT,600,-5,10);
for (Int_t irun=0;irun<fNruns;irun++){
Int_t ientry = -1;
for (Int_t i=ichmin; i<ichmax; i++){
ientry = i+irun*fNChannels;
fChain->GetEntry(ientry);
ntracksRun=nentries/3;
for (Int_t j=0;j<ntracksRun;j++){
Int_t idxexToT = (j* NIDXSMALL)+DELTAIDXTOT;
Int_t idxexTime = (j* NIDXSMALL)+DELTAIDXTIME;
Int_t idxexExTime = (j* NIDXSMALL)+DELTAIDXPID;
Float_t tot = p[idxexToT];
Float_t time = p[idxexTime]-p[idxexExTime];
AliDebug (2, Form("track = %i, time = %f, tot = %f, time-meantime = %f",j,time, tot, time-meantime));
hSlewingProf->Fill(tot,time);
htimetot->Fill(tot,time-meantime);
}
}
}
hSlewingProf->Fit("pol5",optionFit,"",0,4);
TF1 * calibfunc = (TF1*)hSlewingProf->GetFunction("pol5");
Float_t par[6];
for(Int_t kk=0;kk<6;kk++){
par[kk]=calibfunc->GetParameter(kk);
AliDebug(2,Form("parameter %i = %f",kk,par[kk]));
}
if(strstr(optionSave,"save")){
TFile * fileProf = new TFile("TOFCalibSave.root","recreate");
fileProf->cd();
TString profName=Form("Profile%06i_%06i",ichmin,ichmax);
TString timeTotName=Form("TimeTot%06i_%06i",ichmin,ichmax);
TString totName=Form("Tot%06i_%06i",ichmin,ichmax);
TString deltaName=Form("Delta%06i_%06i",ichmin,ichmax);
hSlewingProf->Write(profName);
htimetot->Write(timeTotName);
hToT->Write(totName);
hdeltaTime->Write(deltaName);
fileProf->Close();
delete fileProf;
fileProf=0x0;
}
delete hToT;
hToT=0x0;
delete hSlewingProf;
hSlewingProf=0x0;
delete htimetot;
htimetot=0x0;
delete hdeltaTime;
hdeltaTime=0x0;
AliTOFChannelOffline * calChannel = (AliTOFChannelOffline*)fTOFCalOffline->At(ichmin);
calChannel->SetSlewPar(par);
WriteParOfflineOnCDB("TOF/Calib","valid");
return 0;
}
Int_t AliTOFcalib::Calibrate(Int_t i, Option_t *optionSave, Option_t *optionFit){
TH1::AddDirectory(0);
AliInfo(Form("*** Calibrating Histograms (one channel) %s", GetName())) ;
AliInfo(Form("Option for Saving histos = %s",optionSave )) ;
AliInfo(Form("Option for Fitting Profile histos = %s",optionFit )) ;
Float_t p[MAXCHENTRIESSMALL];
Int_t nentries;
fChain->SetBranchAddress("nentries",&nentries);
fChain->SetBranchAddress("TOFentries",p);
Float_t ntracksTotal =0;
for (Int_t irun=0;irun<fNruns;irun++){
Int_t ientry = -1;
ientry = i+irun*fNChannels;
fChain->GetEntry(ientry);
ntracksTotal+=nentries/3;
}
if (ntracksTotal < MEANENTRIES) {
AliInfo(Form(" Too small mean number of entires per channel (mean number = %f) not calibrating and exiting.....",ntracksTotal));
return 2;
}
Int_t nbinToT = 100;
Float_t minToT = 0;
Float_t maxToT = 4.88;
TH1F *hToT = new TH1F("htot","htot",nbinToT, minToT, maxToT);
TH1F *hdeltaTime = new TH1F("hdeltaTime","hdeltaTime",200,2,4);
Int_t ntracksRun = 0;
Double_t binsProfile[101];
Int_t nusefulbins=0;
Float_t meantime=0;
for (Int_t irun=0;irun<fNruns;irun++){
Int_t ientry = -1;
ientry = i+irun*fNChannels;
fChain->GetEntry(ientry);
ntracksRun=nentries/3;
AliDebug(2,Form("run %i, channel %i, nentries = %i, ntracksRun = %i",irun, i ,nentries, ntracksRun));
for (Int_t j=0;j<ntracksRun;j++){
Int_t idxexToT = (j* NIDXSMALL)+DELTAIDXTOT;
Int_t idxexTime = (j* NIDXSMALL)+DELTAIDXTIME;
Int_t idxexExTime = (j* NIDXSMALL)+DELTAIDXPID;
Float_t tot = p[idxexToT];
meantime+=p[idxexTime]-p[idxexExTime];
hdeltaTime->Fill(p[idxexTime]-p[idxexExTime]);
hToT->Fill(tot);
}
}
nusefulbins = FindBins(hToT,&binsProfile[0]);
meantime/=ntracksTotal;
AliDebug(2,Form("meantime = %f",meantime));
for (Int_t j=1;j<=nusefulbins;j++) {
AliDebug(2,Form(" channel %i, nusefulbins = %i, bin %i = %f",i,nusefulbins,j,binsProfile[j]));
}
TProfile* hSlewingProf = new TProfile("hSlewingProf", "hSlewingProf",nusefulbins, binsProfile, "G");
TH2F * htimetot = new TH2F("htimetot","htimetot",nbinToT, minToT, maxToT,600,-5,10);
for (Int_t irun=0;irun<fNruns;irun++){
Int_t ientry = -1;
ientry = i+irun*fNChannels;
fChain->GetEntry(ientry);
ntracksRun=nentries/3;
for (Int_t j=0;j<ntracksRun;j++){
Int_t idxexToT = (j* NIDXSMALL)+DELTAIDXTOT;
Int_t idxexTime = (j* NIDXSMALL)+DELTAIDXTIME;
Int_t idxexExTime = (j* NIDXSMALL)+DELTAIDXPID;
Float_t tot = p[idxexToT];
Float_t time = p[idxexTime]-p[idxexExTime];
AliDebug (2,Form("track = %i, time = %f, tot = %f, time-meantime = %f",j,time, tot, time-meantime));
hSlewingProf->Fill(tot,time);
htimetot->Fill(tot,time-meantime);
}
}
hSlewingProf->Fit("pol5",optionFit,"",0,4);
TF1 * calibfunc = (TF1*)hSlewingProf->GetFunction("pol5");
Float_t par[6];
for(Int_t kk=0;kk<6;kk++){
par[kk]=calibfunc->GetParameter(kk);
AliDebug(2,Form("parameter %i = %f",kk,par[kk]));
}
if(strstr(optionSave,"save")){
TFile * fileProf = new TFile("TOFCalibSave.root","recreate");
fileProf->cd();
TString profName=Form("Profile%06i",i);
TString timeTotName=Form("TimeTot%06i",i);
TString totName=Form("Tot%06i",i);
TString deltaName=Form("Delta%06i",i);
hSlewingProf->Write(profName);
htimetot->Write(timeTotName);
hToT->Write(totName);
hdeltaTime->Write(deltaName);
fileProf->Close();
delete fileProf;
fileProf=0x0;
}
delete hToT;
hToT=0x0;
delete hSlewingProf;
hSlewingProf=0x0;
delete htimetot;
htimetot=0x0;
delete hdeltaTime;
hdeltaTime=0x0;
AliTOFChannelOffline * calChannel = (AliTOFChannelOffline*)fTOFCalOffline->At(i);
calChannel->SetSlewPar(par);
WriteParOfflineOnCDB("TOF/Calib","valid");
return 0;
}
Int_t AliTOFcalib::Calibrate(Int_t nch, Int_t *ch, Option_t *optionSave, Option_t *optionFit){
TH1::AddDirectory(0);
AliInfo(Form("*** Calibrating Histograms %s, number of channels = %i", GetName(),nch)) ;
AliInfo(Form("Option for Saving histos = %s",optionSave )) ;
AliInfo(Form("Option for Fitting Profile histos = %s",optionFit )) ;
for (Int_t ich=0; ich<nch; ich++){
Int_t i = ch[ich];
AliInfo(Form("Calibrating channel = %i",i )) ;
}
Float_t p[MAXCHENTRIESSMALL];
Int_t nentries;
fChain->SetBranchAddress("nentries",&nentries);
fChain->SetBranchAddress("TOFentries",p);
Float_t ntracksTotalmean =0;
for (Int_t ich=0; ich<nch; ich++){
Int_t ientry = -1;
Int_t i = ch[ich];
for (Int_t irun=0;irun<fNruns;irun++){
ientry = i+irun*fNChannels;
fChain->GetEntry(ientry);
ntracksTotalmean+=nentries/3;
}
}
ntracksTotalmean/=nch;
if (ntracksTotalmean < MEANENTRIES) {
AliInfo(Form(" Too small mean number of entires per channel (mean number = %f) not calibrating and exiting.....",ntracksTotalmean));
return 2;
}
Int_t nbinToT = 100;
Float_t minToT = 0;
Float_t maxToT = 4.88;
TFile * fileProf=0x0;
if(strstr(optionSave,"save")){
fileProf = new TFile("TOFCalibSave.root","recreate");
}
for (Int_t ich=0; ich<nch; ich++) {
TH1F *hToT = new TH1F("htot","htot",nbinToT, minToT, maxToT);
TH1F *hdeltaTime = new TH1F("hdeltaTime","hdeltaTime",200,2,4);
Double_t binsProfile[101];
TH2F * htimetot = new TH2F("htimetot","htimetot",nbinToT, minToT, maxToT,600,-5,10);
Int_t ntracksTotal = 0;
Int_t ntracksRun = 0;
Int_t nusefulbins=0;
Float_t meantime=0;
Int_t i=-1;
for (Int_t irun=0;irun<fNruns;irun++){
i = ch[ich]+irun*fNChannels;
AliDebug(2,Form("Calibrating channel %i",i));
fChain->GetEntry(i);
ntracksTotal+=nentries/3;
}
if (ntracksTotal < MEANENTRIES) {
AliInfo(Form(" Too small mean number of entires in channel %i (number of tracks = %d), not calibrating channel and continuing.....",i,ntracksTotal));
continue;
}
for (Int_t irun=0;irun<fNruns;irun++){
i = ch[ich]+irun*fNChannels;
fChain->GetEntry(i);
ntracksRun=nentries/3;
for (Int_t j=0;j<ntracksRun;j++){
Int_t idxexToT = (j* NIDXSMALL)+DELTAIDXTOT;
Int_t idxexTime = (j* NIDXSMALL)+DELTAIDXTIME;
Int_t idxexExTime = (j* NIDXSMALL)+DELTAIDXPID;
Float_t tot = p[idxexToT];
hdeltaTime->Fill(p[idxexTime]-p[idxexExTime]);
meantime+=p[idxexTime]-p[idxexExTime];
hToT->Fill(tot);
}
}
nusefulbins = FindBins(hToT,&binsProfile[0]);
meantime/=ntracksTotal;
for (Int_t j=1;j<=nusefulbins;j++) {
AliDebug(2,Form(" channel %i, nusefulbins = %i, bin %i = %f",i,nusefulbins,j,binsProfile[j]));
}
TProfile* hSlewingProf = new TProfile("hSlewingProf", "hSlewingProf",nusefulbins, binsProfile, "G");
for (Int_t irun=0;irun<fNruns;irun++){
i = ch[ich]+irun*fNChannels;
fChain->GetEntry(i);
ntracksRun=nentries/3;
for (Int_t j=0;j<ntracksRun;j++){
Int_t idxexToT = (j* NIDXSMALL)+DELTAIDXTOT;
Int_t idxexTime = (j* NIDXSMALL)+DELTAIDXTIME;
Int_t idxexExTime = (j* NIDXSMALL)+DELTAIDXPID;
Float_t tot = p[idxexToT];
Float_t time = p[idxexTime]-p[idxexExTime];
AliDebug(2,Form("track = %i, time = %f, tot = %f, time-meantime = %f",j,time, tot, time-meantime));
hSlewingProf->Fill(tot,time);
htimetot->Fill(tot,time-meantime);
}
}
hSlewingProf->Fit("pol5",optionFit,"",1,4);
TF1 * calibfunc = (TF1*)hSlewingProf->GetFunction("pol5");
Float_t par[6];
for(Int_t kk=0;kk<6;kk++){
par[kk]=calibfunc->GetParameter(kk);
AliDebug(2,Form("parameter %i = %f",kk,par[kk]));
}
if(strstr(optionSave,"save") && fileProf){
TString profName=Form("Profile%06i",i);
TString timeTotName=Form("TimeTot%06i",i);
TString totName=Form("Tot%06i",i);
TString deltaName=Form("Delta%06i",i);
fileProf->cd();
hSlewingProf->Write(profName);
htimetot->Write(timeTotName);
hToT->Write(totName);
hdeltaTime->Write(deltaName);
}
AliTOFChannelOffline * calChannel = (AliTOFChannelOffline*)fTOFCalOffline->At(i);
calChannel->SetSlewPar(par);
delete hToT;
hToT=0x0;
delete hSlewingProf;
hSlewingProf=0x0;
delete htimetot;
htimetot=0x0;
delete hdeltaTime;
hdeltaTime=0x0;
}
if(strstr(optionSave,"save") && fileProf){
fileProf->Close();
delete fileProf;
fileProf=0x0;
}
WriteParOfflineOnCDB("TOF/Calib","valid");
return 0;
}
Int_t AliTOFcalib::CalibrateFromProfile(Int_t ich, Option_t *optionSave, Option_t *optionFit){
TH1::AddDirectory(0);
AliInfo(Form("*** Calibrating Histograms From Profile %s", GetName())) ;
AliInfo(Form("Option for Saving histos = %s",optionSave )) ;
AliInfo(Form("Option for Fitting Profile histos = %s",optionFit )) ;
Float_t p[MAXCHENTRIESSMALL];
Int_t nentries;
Int_t ntracksTotal=0;
fChain->SetBranchAddress("nentries",&nentries);
fChain->SetBranchAddress("TOFentries",p);
for (Int_t irun=0;irun<fNruns;irun++){
Int_t i = ich+irun*fNChannels;
fChain->GetEntry(i);
ntracksTotal+=nentries/3;
}
if (ntracksTotal < MEANENTRIES) {
AliInfo(Form(" Too small mean number of entires per channel (mean number = %d) not calibrating and exiting.....",ntracksTotal));
return 2;
}
TH1F * hProf = Profile(ich);
hProf->Fit("pol5",optionFit,"",0,4);
TF1 * calibfunc = (TF1*)hProf->GetFunction("pol5");
Float_t par[6];
for(Int_t kk=0;kk<6;kk++){
par[kk]=calibfunc->GetParameter(kk);
AliDebug(2,Form("parameter %i = %f",kk,par[kk]));
}
if(strstr(optionSave,"save")){
TFile * fileProf = new TFile("TOFCalibSave.root","recreate");
fileProf->cd();
TString profName=Form("Profile%06i",ich);
hProf->Write(profName);
fileProf->Close();
delete fileProf;
fileProf=0x0;
}
delete hProf;
hProf=0x0;
AliTOFChannelOffline * calChannel = (AliTOFChannelOffline*)fTOFCalOffline->At(ich);
calChannel->SetSlewPar(par);
WriteParOfflineOnCDB("TOF/Calib","valid");
return 0;
}
Int_t AliTOFcalib::Calibrate(Option_t *optionSave, Option_t *optionFit){
TH1::AddDirectory(0);
AliInfo(Form("*** Calibrating Histograms %s, all channels", GetName())) ;
AliInfo(Form("Option for Saving histos = %s",optionSave )) ;
AliInfo(Form("Option for Fitting Profile histos = %s",optionFit )) ;
TFile * fileProf=0x0;
if(strstr(optionSave,"save")){
fileProf = new TFile("TOFCalibSave.root","recreate");
}
Float_t p[MAXCHENTRIESSMALL];
Int_t nentries;
fChain->SetBranchAddress("nentries",&nentries);
fChain->SetBranchAddress("TOFentries",p);
Float_t ntracksTotalmean =0;
for (Int_t ii=0; ii<fNChannels; ii++){
for (Int_t irun=0;irun<fNruns;irun++){
Int_t i = ii+irun*fNChannels;
fChain->GetEntry(i);
ntracksTotalmean+=nentries/3;
}
}
ntracksTotalmean/=fNChannels;
if (ntracksTotalmean < MEANENTRIES) {
AliInfo(Form(" Too small mean number of entires per channel (mean number = %f) not calibrating and exiting.....",ntracksTotalmean));
return 2;
}
Int_t nbinToT = 100;
Float_t minToT = 0;
Float_t maxToT = 4.88;
for (Int_t ii=0; ii<fNChannels; ii++) {
TH1F *hToT = new TH1F("htot","htot",nbinToT, minToT, maxToT);
TH1F *hdeltaTime = new TH1F("hdeltaTime","hdeltaTime",200,2,4);
TH2F * htimetot = new TH2F("htimetot","htimetot",nbinToT, minToT, maxToT,600,-5,10);
if (ii%1000 == 0) AliDebug(1,Form("Calibrating channel %i ",ii));
Int_t nusefulbins=0;
Double_t binsProfile[101];
Int_t ntracksRun = 0;
Int_t ntracksTotal = 0;
for (Int_t irun=0;irun<fNruns;irun++){
Int_t i = ii+irun*fNChannels;
fChain->GetEntry(i);
ntracksTotal+=nentries/3;
}
if (ntracksTotal < MEANENTRIES) {
AliInfo(Form(" Too small mean number of entires in channel %i (number of tracks = %d), not calibrating channel and continuing.....",ii,ntracksTotal));
continue;
}
Float_t meantime=0;
for (Int_t irun=0;irun<fNruns;irun++){
Int_t i = ii+irun*fNChannels;
fChain->GetEntry(i);
ntracksRun=nentries/3;
for (Int_t j=0;j<ntracksRun;j++){
Int_t idxexToT = (j* NIDXSMALL)+DELTAIDXTOT;
Int_t idxexTime = (j* NIDXSMALL)+DELTAIDXTIME;
Int_t idxexExTime = (j* NIDXSMALL)+DELTAIDXPID;
Float_t tot = p[idxexToT];
hdeltaTime->Fill(p[idxexTime]-p[idxexExTime]);
meantime+=p[idxexTime]-p[idxexExTime];
hToT->Fill(tot);
}
}
nusefulbins = FindBins(hToT,&binsProfile[0]);
meantime/=ntracksTotal;
for (Int_t j=0;j<nusefulbins;j++) {
AliDebug(2,Form(" channel %i, usefulbin = %i, low edge = %f",ii,j,binsProfile[j]));
}
TProfile* hSlewingProf = new TProfile("hSlewingProf", "hSlewingProf",nusefulbins, binsProfile, "G");
for (Int_t irun=0;irun<fNruns;irun++){
Int_t i = ii+irun*fNChannels;
fChain->GetEntry(i);
ntracksRun=nentries/3;
for (Int_t j=0;j<ntracksRun;j++){
Int_t idxexToT = (j* NIDXSMALL)+DELTAIDXTOT;
Int_t idxexTime = (j* NIDXSMALL)+DELTAIDXTIME;
Int_t idxexExTime = (j* NIDXSMALL)+DELTAIDXPID;
Float_t tot = p[idxexToT];
Float_t time = p[idxexTime]-p[idxexExTime];
AliDebug (2,Form("track = %i, time = %f, tot = %f, time-meantime = %f",j,time, tot, time-meantime));
hSlewingProf->Fill(tot,time);
htimetot->Fill(tot,time-meantime);
}
}
hSlewingProf->Fit("pol5",optionFit,"",1,4);
TF1 * calibfunc = (TF1*)hSlewingProf->GetFunction("pol5");
Float_t par[6];
for(Int_t kk=0;kk<6;kk++){
par[kk]=calibfunc->GetParameter(kk);
AliDebug(2,Form("parameter %i = %f",kk,par[kk]));
}
if(strstr(optionSave,"save") && fileProf){
TString profName=Form("Profile%06i",ii);
TString timeTotName=Form("TimeTot%06i",ii);
TString totName=Form("Tot%06i",ii);
TString deltaName=Form("Delta%06i",ii);
fileProf->cd();
hSlewingProf->Write(profName);
htimetot->Write(timeTotName);
hToT->Write(totName);
hdeltaTime->Write(deltaName);
}
AliTOFChannelOffline * calChannel = (AliTOFChannelOffline*)fTOFCalOffline->At(ii);
calChannel->SetSlewPar(par);
delete hToT;
hToT=0x0;
delete hSlewingProf;
hSlewingProf=0x0;
delete htimetot;
htimetot=0x0;
delete hdeltaTime;
hdeltaTime=0x0;
}
if(strstr(optionSave,"save")){
fileProf->Close();
delete fileProf;
fileProf=0x0;
}
WriteParOfflineOnCDB("TOF/Calib","valid");
return 0;
}
TH1F* AliTOFcalib::Profile(Int_t ich)
{
Float_t p[MAXCHENTRIESSMALL];
Int_t nentries;
fChain->SetBranchAddress("nentries",&nentries);
fChain->SetBranchAddress("TOFentries",p);
const Int_t knbinToT = 100;
Int_t nbinTime = 200;
Float_t minTime = -5.5;
Float_t maxTime = 5.5;
Float_t minToT = 0;
Float_t maxToT = 5.;
Float_t deltaToT = (maxToT-minToT)/knbinToT;
Double_t mTime[knbinToT+1],mToT[knbinToT+1],meanTime[knbinToT+1], meanTime2[knbinToT+1],vToT[knbinToT+1], vToT2[knbinToT+1],meanToT[knbinToT+1],meanToT2[knbinToT+1],vTime[knbinToT+1],vTime2[knbinToT+1],sigmaTime[knbinToT+1];
Int_t n[knbinToT+1], nentrx[knbinToT+1];
for (Int_t i = 0; i < knbinToT+1 ; i++){
mTime[i]=0;
mToT[i]=0;
n[i]=0;
meanTime[i]=0;
meanTime2[i]=0;
vToT[i]=0;
vToT2[i]=0;
meanToT[i]=0;
meanToT2[i]=0;
vTime[i]=0;
vTime2[i]=0;
sigmaTime[i]=0;
n[i]=0;
nentrx[i]=0;
}
TH2F* hSlewing = new TH2F("hSlewing", "hSlewing", knbinToT, minToT, maxToT, nbinTime, minTime, maxTime);
Int_t ntracksRun = 0;
TH1F *histo = new TH1F("histo", "1D Time vs ToT", knbinToT, minToT, maxToT);
for (Int_t irun=0;irun<fNruns;irun++){
Int_t i = ich+irun*fNChannels;
fChain->GetEntry(i);
ntracksRun=nentries/3;
for (Int_t j=0;j<ntracksRun;j++){
Int_t idxexToT = (j* NIDXSMALL)+DELTAIDXTOT;
Int_t idxexTime = (j* NIDXSMALL)+DELTAIDXTIME;
Int_t idxexExTime = (j* NIDXSMALL)+DELTAIDXPID;
Float_t tot = p[idxexToT];
Float_t time = p[idxexTime]-p[idxexExTime];
Int_t nx = (Int_t)((tot-minToT)/deltaToT)+1;
if ((tot != 0) && ( time!= 0)){
vTime[nx]+=time;
vTime2[nx]+=time*time;
vToT[nx]+=tot;
vToT2[nx]+=tot*tot;
nentrx[nx]++;
hSlewing->Fill(tot,time);
}
}
}
Int_t nbinsToT=hSlewing->GetNbinsX();
if (nbinsToT != knbinToT) {
AliError("Profile :: incompatible numbers of bins");
return 0x0;
}
Int_t usefulBins=0;
for (Int_t i=1;i<=nbinsToT;i++){
if (nentrx[i]!=0){
n[usefulBins]+=nentrx[i];
if (n[usefulBins]==0 && i == nbinsToT) {
break;
}
meanTime[usefulBins]+=vTime[i];
meanTime2[usefulBins]+=vTime2[i];
meanToT[usefulBins]+=vToT[i];
meanToT2[usefulBins]+=vToT2[i];
if (n[usefulBins]<10 && i!=nbinsToT) continue;
mTime[usefulBins]=meanTime[usefulBins]/n[usefulBins];
mToT[usefulBins]=meanToT[usefulBins]/n[usefulBins];
sigmaTime[usefulBins]=TMath::Sqrt(1./n[usefulBins]/n[usefulBins]
*(meanTime2[usefulBins]-meanTime[usefulBins]
*meanTime[usefulBins]/n[usefulBins]));
if ((1./n[usefulBins]/n[usefulBins]
*(meanToT2[usefulBins]-meanToT[usefulBins]
*meanToT[usefulBins]/n[usefulBins]))< 0) {
AliError(" too small radical" );
}
else{
}
usefulBins++;
}
}
for (Int_t i=0;i<usefulBins;i++){
Int_t binN = (Int_t)((mToT[i]-minToT)/deltaToT)+1;
histo->Fill(mToT[i],mTime[i]);
histo->SetBinError(binN,sigmaTime[i]);
}
delete hSlewing;
hSlewing=0x0;
return histo;
}
Int_t AliTOFcalib::FindBins(TH1F* h, Double_t *binsProfile) const{
Int_t cont = 0;
Int_t startBin = 1;
Int_t nbin = h->GetNbinsX();
Int_t nentries = (Int_t)h->GetEntries();
Float_t max = h->GetBinLowEdge(nbin);
Int_t nusefulbins=0;
Int_t maxcont=0;
if (nentries <= 60) maxcont = 2;
else if (nentries <= 100) maxcont = 5;
else if (nentries <= 500) maxcont = 10;
else maxcont = 20;
for (Int_t j=1;j<=nbin;j++) {
cont += (Int_t)h->GetBinContent(j);
if (j<nbin){
if (cont>=maxcont){
nusefulbins++;
binsProfile[nusefulbins-1]=h->GetBinLowEdge(startBin);
cont=0;
startBin=j+1;
continue;
}
}
else{
if (cont>=maxcont){
nusefulbins++;
binsProfile[nusefulbins-1]=h->GetBinLowEdge(startBin);
binsProfile[nusefulbins]=max;
}
else {
binsProfile[nusefulbins]=h->GetBinLowEdge(startBin);
}
}
}
return nusefulbins;
}
void
AliTOFcalib::CreateDeltaBCOffset()
{
if (fDeltaBCOffset) {
AliWarning("DeltaBCOffset object already defined, cannot create a new one");
return;
}
fDeltaBCOffset = new AliTOFDeltaBCOffset();
}
void
AliTOFcalib::CreateCTPLatency()
{
if (fCTPLatency) {
AliWarning("CTPLatency object already defined, cannot create a new one");
return;
}
fCTPLatency = new AliTOFCTPLatency();
}
void
AliTOFcalib::CreateT0Fill()
{
if (fT0Fill) {
AliWarning("T0Fill object already defined, cannot create a new one");
return;
}
fT0Fill = new AliTOFT0Fill();
}
void
AliTOFcalib::CreateRunParams()
{
if (fRunParams) {
AliWarning("RunParams object already defined, cannot create a new one");
return;
}
fRunParams = new AliTOFRunParams();
}
void
AliTOFcalib::WriteDeltaBCOffsetOnCDB(const Char_t *sel , Int_t minrun, Int_t maxrun)
{
if (!fDeltaBCOffset) return;
AliCDBId id(Form("%s/DeltaBCOffset", sel), minrun, maxrun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Roberto Preghenella");
AliCDBManager *man = AliCDBManager::Instance();
man->Put(fDeltaBCOffset, id, md);
AliDebug(2,Form("DeltaBCOffset written on CDB with run range [%i, %i] ",minrun ,maxrun));
delete md;
}
void
AliTOFcalib::WriteCTPLatencyOnCDB(const Char_t *sel , Int_t minrun, Int_t maxrun)
{
if (!fCTPLatency) return;
AliCDBId id(Form("%s/CTPLatency", sel), minrun, maxrun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Roberto Preghenella");
AliCDBManager *man = AliCDBManager::Instance();
man->Put(fCTPLatency, id, md);
AliDebug(2,Form("CTPLatency written on CDB with run range [%i, %i] ",minrun ,maxrun));
delete md;
}
void
AliTOFcalib::WriteT0FillOnCDB(const Char_t *sel , Int_t minrun, Int_t maxrun)
{
if (!fT0Fill) return;
AliCDBId id(Form("%s/T0Fill", sel), minrun, maxrun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Roberto Preghenella");
AliCDBManager *man = AliCDBManager::Instance();
man->Put(fT0Fill, id, md);
AliDebug(2,Form("T0Fill written on CDB with run range [%i, %i] ",minrun ,maxrun));
delete md;
}
void
AliTOFcalib::WriteRunParamsOnCDB(const Char_t *sel , Int_t minrun, Int_t maxrun)
{
if (!fRunParams) return;
AliCDBId id(Form("%s/RunParams", sel), minrun, maxrun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Roberto Preghenella");
AliCDBManager *man = AliCDBManager::Instance();
man->Put(fRunParams, id, md);
AliDebug(2,Form("RunParams written on CDB with run range [%i, %i] ",minrun ,maxrun));
delete md;
}
void
AliTOFcalib::WriteReadoutEfficiencyOnCDB(const Char_t *sel , Int_t minrun, Int_t maxrun)
{
if (!fReadoutEfficiency) return;
AliCDBId id(Form("%s/ReadoutEfficiency", sel), minrun, maxrun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Roberto Preghenella");
AliCDBManager *man = AliCDBManager::Instance();
man->Put(fReadoutEfficiency, id, md);
AliDebug(2,Form("ReadoutEfficiency written on CDB with run range [%i, %i] ",minrun ,maxrun));
delete md;
}
void
AliTOFcalib::WriteProblematicOnCDB(const Char_t *sel , Int_t minrun, Int_t maxrun)
{
if (!fProblematic) return;
AliCDBId id(Form("%s/Problematic", sel), minrun, maxrun);
AliCDBMetaData *md = new AliCDBMetaData();
md->SetResponsible("Roberto Preghenella");
AliCDBManager *man = AliCDBManager::Instance();
man->Put(fProblematic, id, md);
AliDebug(2,Form("Problematic written on CDB with run range [%i, %i] ",minrun ,maxrun));
delete md;
}
Bool_t
AliTOFcalib::ReadDeltaBCOffsetFromCDB(const Char_t *sel , Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
AliCDBEntry *entry = man->Get(Form("%s/DeltaBCOffset", sel),nrun);
if (!entry) {
AliFatal("No DeltaBCOffset entry found in CDB");
exit(0);
}
fDeltaBCOffset =(AliTOFDeltaBCOffset *)entry->GetObject();
if(!fDeltaBCOffset){
AliFatal("No DeltaBCOffset object found in CDB entry");
exit(0);
}
return kTRUE;
}
Bool_t
AliTOFcalib::ReadCTPLatencyFromCDB(const Char_t *sel , Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
AliCDBEntry *entry = man->Get(Form("%s/CTPLatency", sel),nrun);
if (!entry) {
AliFatal("No CTPLatency entry found in CDB");
exit(0);
}
fCTPLatency =(AliTOFCTPLatency *)entry->GetObject();
if(!fCTPLatency){
AliFatal("No CTPLatency object found in CDB entry");
exit(0);
}
return kTRUE;
}
Bool_t
AliTOFcalib::ReadT0FillFromCDB(const Char_t *sel , Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
AliCDBEntry *entry = man->Get(Form("%s/T0Fill", sel),nrun);
if (!entry) {
AliFatal("No T0Fill entry found in CDB");
exit(0);
}
fT0Fill =(AliTOFT0Fill *)entry->GetObject();
if(!fT0Fill){
AliFatal("No T0Fill object found in CDB entry");
exit(0);
}
return kTRUE;
}
Bool_t
AliTOFcalib::ReadRunParamsFromCDB(const Char_t *sel , Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
AliCDBEntry *entry = man->Get(Form("%s/RunParams", sel),nrun, fRunParamsSpecificVersion);
if (!entry) {
AliFatal("No RunParams entry found in CDB");
exit(0);
}
fRunParams =(AliTOFRunParams *)entry->GetObject();
if(!fRunParams){
AliFatal("No RunParams object found in CDB entry");
exit(0);
}
return kTRUE;
}
Bool_t
AliTOFcalib::ReadLHCClockPhaseFromCDB(const Char_t *sel , Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
AliCDBEntry *entry = man->Get(Form("%s/LHCClockPhase", sel),nrun);
if (!entry) {
AliFatal("No LHCClockPhase entry found in CDB");
exit(0);
}
fLHCClockPhase =(AliLHCClockPhase *)entry->GetObject();
if(!fRunParams){
AliFatal("No LHCClockPhase object found in CDB entry");
exit(0);
}
return kTRUE;
}
Bool_t
AliTOFcalib::ReadReadoutEfficiencyFromCDB(const Char_t *sel , Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
AliCDBEntry *entry = man->Get(Form("%s/ReadoutEfficiency", sel),nrun);
if (!entry) {
AliFatal("No ReadoutEfficiency entry found in CDB");
exit(0);
}
fReadoutEfficiency = (TH1F *)entry->GetObject();
if(!fReadoutEfficiency){
AliFatal("No ReadoutEfficiency object found in CDB entry");
exit(0);
}
return kTRUE;
}
Bool_t
AliTOFcalib::ReadProblematicFromCDB(const Char_t *sel , Int_t nrun)
{
AliCDBManager *man = AliCDBManager::Instance();
AliCDBEntry *entry = man->Get(Form("%s/Problematic", sel),nrun);
if (!entry) {
AliFatal("No Problematic entry found in CDB");
exit(0);
}
fProblematic = (TH1C *)entry->GetObject();
if(!fProblematic){
AliFatal("No Problematic object found in CDB entry");
exit(0);
}
return kTRUE;
}
Bool_t
AliTOFcalib::Init(Int_t run)
{
if (fInitFlag) {
AliWarning("the class was already initialized, re-initialize it");
fInitFlag = kFALSE;
}
if (!ReadParOnlineStatusFromCDB("TOF/Calib", run)) {
AliError("cannot get \"Status\" object from OCDB");
return kFALSE;
}
if (!ReadParOfflineFromCDB("TOF/Calib", run)) {
AliError("cannot get \"ParOffline\" object from OCDB");
return kFALSE;
}
if (!ReadDeltaBCOffsetFromCDB("TOF/Calib", run)) {
AliError("cannot get \"DeltaBCOffset\" object from OCDB");
return kFALSE;
}
if (!ReadCTPLatencyFromCDB("TOF/Calib", run)) {
AliError("cannot get \"CTPLatency\" object from OCDB");
return kFALSE;
}
if (!ReadRunParamsFromCDB("TOF/Calib", run)) {
AliError("cannot get \"RunParams\" object from OCDB");
return kFALSE;
}
if (!ReadLHCClockPhaseFromCDB("GRP/Calib", run)) {
AliError("cannot get \"LHCClockPhase\" object from OCDB");
return kFALSE;
}
if (!ReadReadoutEfficiencyFromCDB("TOF/Calib", run)) {
AliError("cannot get \"ReadoutEfficiency\" object from OCDB");
return kFALSE;
}
if (!ReadProblematicFromCDB("TOF/Calib", run)) {
AliError("cannot get \"Problematic\" object from OCDB");
return kFALSE;
}
TFile *responseFile = TFile::Open("$ALICE_ROOT/TOF/data/AliTOFresponsePar.root");
if (!responseFile || !responseFile->IsOpen()) {
AliError("cannot open \"ResponseParams\" local file");
return kFALSE;
}
fResponseParams = (AliTOFResponseParams *)responseFile->Get("ResponseParams");
if (!fResponseParams) {
AliError("cannot get \"ResponseParams\" object from local file");
return kFALSE;
}
responseFile->Close();
if (fRunParams->GetUseLHCClockPhase())
fUseLHCClockPhase = kTRUE;
if (fUseLHCClockPhase)
AliInfo("calibration using BPTX LHC clock-phase");
fInitFlag = kTRUE;
return kTRUE;
}
Double_t
AliTOFcalib::GetTimeCorrection(Int_t index, Double_t tot, Int_t deltaBC, Int_t l0l1, UInt_t timestamp)
{
if (!fInitFlag) {
AliError("class not yet initialized. Initialize it before.");
return 0.;
}
if (l0l1 < 0) l0l1 += 3564;
AliTOFChannelOffline *parOffline = (AliTOFChannelOffline *)fTOFCalOffline->At(index);
Int_t deltaBCOffset = fDeltaBCOffset->GetDeltaBCOffset();
Float_t ctpLatency = fCTPLatency->GetCTPLatency();
Float_t tdcLatencyWindow = fStatus->GetLatencyWindow(index) * 1.e3;
Float_t timezero = fRunParams->EvalT0(timestamp);
Float_t clockphase = fLHCClockPhase->GetPhase(timestamp);
if (!fRemoveMeanT0) timezero = 0.;
if (fUseLHCClockPhase) timezero -= 1.e3 * clockphase;
Double_t corr = 0.;
deltaBC = deltaBCOffset;
corr += (deltaBC - deltaBCOffset) * AliTOFGeometry::BunchCrossingBinWidth();
corr -= l0l1 * AliTOFGeometry::BunchCrossingBinWidth();
corr -= ctpLatency;
corr += tdcLatencyWindow;
corr += timezero;
if (tot < AliTOFGeometry::SlewTOTMin())
tot = AliTOFGeometry::SlewTOTMin();
if (tot > AliTOFGeometry::SlewTOTMax())
tot = AliTOFGeometry::SlewTOTMax();
for (Int_t islew = 0; islew < 6; islew++)
corr += parOffline->GetSlewPar(islew) * TMath::Power(tot, islew) * 1.e3;
return corr;
}
void
AliTOFcalib::CalibrateESD(AliESDEvent *event)
{
if (!fInitFlag) {
AliError("class not yet initialized. Initialize it before.");
return;
}
Int_t index, l0l1, deltaBC;
Double_t time, tot, corr;
UInt_t timestamp = event->GetTimeStamp();
AliESDTOFHit* hit = NULL;
AliESDtrack* track = NULL;
TClonesArray* esdTOFhits = event->GetESDTOFHits();
if (esdTOFhits) {
for (Int_t ihit = 0; ihit < esdTOFhits->GetEntriesFast(); ihit++) {
hit = (AliESDTOFHit*)esdTOFhits->At(ihit);
if (!hit) continue;
if (fCalibrateTOFsignal) {
index = hit->GetTOFchannel();
time = hit->GetTimeRaw();
tot = hit->GetTOT();
l0l1 = hit->GetL0L1Latency();
deltaBC = hit->GetDeltaBC();
corr = GetTimeCorrection(index, tot, deltaBC, l0l1, timestamp);
time -= corr;
hit->SetTime(time);
}
}
}
else {
for (Int_t itrk = 0; itrk < event->GetNumberOfTracks(); itrk++) {
track = event->GetTrack(itrk);
if (!track || !(track->GetStatus() & AliESDtrack::kTOFout)) continue;
if (fCalibrateTOFsignal) {
index = track->GetTOFCalChannel();
time = track->GetTOFsignalRaw();
tot = track->GetTOFsignalToT();
l0l1 = track->GetTOFL0L1();
deltaBC = track->GetTOFDeltaBC();
corr = GetTimeCorrection(index, tot, deltaBC, l0l1, timestamp);
time -= corr;
track->SetTOFsignal(time);
}
}
if (fCorrectTExp)
CalibrateTExp(event);
}
}
Bool_t
AliTOFcalib::IsChannelEnabled(Int_t index, Bool_t checkEfficiency, Bool_t checkProblematic)
{
if (!fInitFlag) {
AliError("class not yet initialized. Initialize it before.");
return kTRUE;
}
if (fStatus->GetPulserStatus(index) == AliTOFChannelOnlineStatusArray::kTOFPulserBad) return kFALSE;
if (fStatus->GetNoiseStatus(index) == AliTOFChannelOnlineStatusArray::kTOFNoiseBad) return kFALSE;
if (fStatus->GetHWStatus(index) == AliTOFChannelOnlineStatusArray::kTOFHWBad) return kFALSE;
if (checkEfficiency && !IsChannelEfficient(index)) return kFALSE;
if (checkProblematic && IsChannelProblematic(index)) return kFALSE;
return kTRUE;
}
Bool_t
AliTOFcalib::IsChannelEfficient(Int_t index)
{
if (!fInitFlag) {
AliError("class not yet initialized. Initialize it before.");
return kTRUE;
}
if (fReadoutEfficiency->GetBinContent(index + 1) < 0.95) return kFALSE;
return kTRUE;
}
Bool_t
AliTOFcalib::IsChannelProblematic(Int_t index)
{
if (!fInitFlag) {
AliError("class not yet initialized. Initialize it before.");
return kTRUE;
}
if (fProblematic->GetBinContent(index + 1) != 0) return kTRUE;
return kFALSE;
}
void
AliTOFcalib::CalibrateTExp(AliESDEvent *event) const
{
TClonesArray* esdTOFhits = event->GetESDTOFHits();
if (esdTOFhits) {
AliFatal("This method is DEPRECATED, doing NOTHING");
return ;
}
if (!fInitFlag) {
AliError("class not yet initialized. Initialize it before.");
return;
}
AliESDtrack *track = NULL;
Double_t texp[AliPID::kSPECIESC];
for (Int_t itrk = 0; itrk < event->GetNumberOfTracks(); itrk++) {
track = event->GetTrack(itrk);
if (!track || !(track->GetStatus() & AliESDtrack::kTOFout)) continue;
track->GetIntegratedTimes(texp,AliPID::kSPECIESC);
for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++)
texp[ipart] += fResponseParams->EvalTExpCorr(ipart, track->P());
track->SetIntegratedTimes(texp);
}
}
Double_t
AliTOFcalib::TuneForMC(AliESDEvent *event, Double_t resolution)
{
TClonesArray* esdTOFhits = event->GetESDTOFHits();
if (esdTOFhits) {
AliFatal("This method is DEPRECATED, doing NOTHING");
return 0.;
}
Double_t diamond2 = TMath::Abs(event->GetSigma2DiamondZ());
Double_t t0spread = TMath::Sqrt(diamond2) / 2.99792457999999984e-02;
Double_t startTime = gRandom->Gaus(0., t0spread);
Double_t defaultResolution = 80.;
Double_t extraSmearing = 0.;
if (resolution > defaultResolution)
extraSmearing = TMath::Sqrt(resolution * resolution - defaultResolution * defaultResolution);
AliESDtrack *track = NULL;
Double_t time;
for (Int_t itrk = 0; itrk < event->GetNumberOfTracks(); itrk++) {
track = event->GetTrack(itrk);
if (!track) continue;
if (!track->IsOn(AliESDtrack::kTOFout)) continue;
if (!IsChannelEnabled(track->GetTOFCalChannel())) {
track->ResetStatus(AliESDtrack::kTOFin);
track->ResetStatus(AliESDtrack::kTOFout);
track->ResetStatus(AliESDtrack::kTOFmismatch);
track->ResetStatus(AliESDtrack::kTOFpid);
}
time = track->GetTOFsignal();
time += startTime;
time += gRandom->Gaus(0., extraSmearing);
time -= 25.;
track->SetTOFsignal(time);
}
return startTime;
}