#include "AliTRDCalibraMode.h"
#include "AliTRDCalibraFit.h"
#include "AliTRDCalibraVdriftLinearFit.h"
+#include "AliTRDCalibraExbAltFit.h"
#include "AliTRDPreprocessorOffline.h"
#include "AliTRDCalChamberStatus.h"
#include "AliTRDCalibChamberStatus.h"
#include "AliTRDCommonParam.h"
#include "AliCDBManager.h"
#include "AliCDBEntry.h"
-
+#include "AliTRDdEdxBaseUtils.h"
+#include "AliTRDdEdxCalibHistArray.h"
+#include "AliTRDdEdxCalibUtils.h"
ClassImp(AliTRDPreprocessorOffline)
fPRF2d(0x0),
fSparse(0x0),
fAliTRDCalibraVdriftLinearFit(0x0),
+ fAliTRDCalibraExbAltFit(0x0),
fNEvents(0x0),
fAbsoluteGain(0x0),
- fPlots(new TObjArray(9)),
- fCalibObjects(new TObjArray(9)),
+ fPlots(new TObjArray(kNumCalibObjs)),
+ fCalibObjects(new TObjArray(kNumCalibObjs)),
fFirstRunGainUsed(0),
fVersionGainUsed(0),
fSubVersionGainUsed(0),
fMinStatsGain(800),
fMinStatsPRF(600),
fMinStatsChamberStatus(20),
+ fMinSingleStatsChamberStatus(0.05),
fBackCorrectGain(kFALSE),
fBackCorrectVdrift(kTRUE),
fNotEnoughStatisticsForTheGain(kFALSE),
fNotEnoughStatisticsForTheVdriftLinear(kFALSE),
fStatusNeg(0),
fStatusPos(0),
- fBadCalibValidate(20),
- fNoDataValidate(20),
+ fBadCalibValidate(40),
+ fNoDataValidate(40),
fRMSBadCalibratedGain(20.0),
fRMSBadCalibratedVdrift(20.0),
- fRMSBadCalibratedExB(50.0)
+ fRMSBadCalibratedExB(20.0),
+ fRobustFitDriftVelocity(kTRUE),
+ fRobustFitExbAlt(kFALSE),
+ fAlternativeVdrfitFit(kFALSE),
+ fAlternativeExbAltFit(kFALSE),
+ fMinNbOfPointVdriftFit(11),
+ fMethodeGain(0),
+ fOutliersFitChargeLow(0.03),
+ fOutliersFitChargeHigh(0.7),
+ fBeginFitCharge(3.5),
+ fPHQon(kTRUE)
{
//
// default constructor
if(fPH2d) delete fPH2d;
if(fPRF2d) delete fPRF2d;
if(fSparse) delete fSparse;
+
+ if(IsPHQon()){
+ AliTRDdEdxCalibUtils::DeleteHistArray();
+ AliTRDdEdxCalibUtils::DeleteObjArray();
+ }
+
if(fAliTRDCalibraVdriftLinearFit) delete fAliTRDCalibraVdriftLinearFit;
+ if(fAliTRDCalibraExbAltFit) delete fAliTRDCalibraExbAltFit;
if(fNEvents) delete fNEvents;
if(fAbsoluteGain) delete fAbsoluteGain;
if(fPlots) delete fPlots;
CalibVdriftT0(file,startRunNumber,endRunNumber,ocdbStorage);
CalibGain(file,startRunNumber,endRunNumber,ocdbStorage);
CalibChamberStatus(file,startRunNumber,endRunNumber,ocdbStorage);
-
+ CalibExbAlt(file,startRunNumber,endRunNumber,ocdbStorage);
+
}
-
+
+ if(IsPHQon()){
+ printf("\n AliTRDPreprocessorOffline PHQ on!!\n\n");
+ AliTRDdEdxBaseUtils::PrintControl();
+ CalibPHQ(file, startRunNumber, endRunNumber, ocdbStorage);
+ }
+ else{
+ printf("\n AliTRDPreprocessorOffline PHQ off!!\n\n");
+ }
+
PrintStatus();
}
if(fExBValidated) UpdateOCDBExB(startRunNumber,endRunNumber,ocdbStorage);
}
+//___________________________________________________________________________________________________________________
+
+void AliTRDPreprocessorOffline::CalibExbAlt(const Char_t* file, Int_t startRunNumber, Int_t endRunNumber, TString ocdbStorage){
+ //
+ // make calibration of the drift velocity
+ // Input parameters:
+ // file - the location of input file
+ // startRunNumber, endRunNumber - run validity period
+ // ocdbStorage - path to the OCDB storage
+ // - if empty - local storage 'pwd' uesed
+ if (ocdbStorage.Length()<=0) ocdbStorage="local://"+gSystem->GetFromPipe("pwd")+"/OCDB";
+ //
+ // 1. Initialization
+ //
+
+ //
+ // 2. extraction of the information
+ //
+ if(ReadExbAltFitGlobal(file)) AnalyzeExbAltFit();
+ //
+ // 3. Append QA plots
+ //
+ //MakeDefaultPlots(fVdriftArray,fVdriftArray);
+ //
+ //
+ // 4. validate OCDB entries
+ //
+ //
+ // 5. update of OCDB
+ //
+ //
+ UpdateOCDBExBAlt(startRunNumber,endRunNumber,ocdbStorage);
+
+}
+
//_________________________________________________________________________________________________________________
void AliTRDPreprocessorOffline::CalibGain(const Char_t* file, Int_t startRunNumber, Int_t endRunNumber, TString ocdbStorage){
//
AnalyzeGain();
if(fBackCorrectGain) CorrectFromDetGainUsed();
- if(fBackCorrectVdrift) CorrectFromDetVdriftUsed();
+ //if(fBackCorrectVdrift) CorrectFromDetVdriftUsed();
//
// 3. Append QA plots
//
UpdateOCDBPRF(startRunNumber,endRunNumber,ocdbStorage);
}
+//________________________________________________________________________________________________________________
+void AliTRDPreprocessorOffline::CalibPHQ(const Char_t* file, Int_t startRunNumber, Int_t endRunNumber, TString ocdbStorage)
+{
+ //
+ // make calibration of puls height Q
+ // Input parameters:
+ // startRunNumber, endRunNumber - run validity period
+ // ocdbStorage - path to the OCDB storage
+ // - if empty - local storage 'pwd' uesed
+ //
+
+ if (ocdbStorage.Length()<=0) ocdbStorage="local://"+gSystem->GetFromPipe("pwd")+"/OCDB";
+ //printf("test %s\n", ocdbStorage.Data());
+
+ if(!ReadPHQGlobal(file)) return;
+
+ if(!AnalyzePHQ(startRunNumber)) return;
+
+ UpdateOCDBPHQ(startRunNumber,endRunNumber,ocdbStorage);
+}
+
//________________________________________________________________________________________________________________
void AliTRDPreprocessorOffline::CalibChamberStatus(const Char_t* file, Int_t startRunNumber, Int_t endRunNumber, TString ocdbStorage){
if(fVersionVdriftUsed == 0) fStatusPos = fStatusPos |kVdriftErrorOld;
if(fVersionGainUsed == 0) fStatusPos = fStatusPos | kGainErrorOld;
-
+
return kTRUE;
}
}
//___________________________________________________________________________________________________________________
+Bool_t AliTRDPreprocessorOffline::ReadPHQGlobal(const Char_t* fileName)
+{
+ //
+ // read calibration entries from file
+ //
+
+ return AliTRDdEdxCalibUtils::ReadHistArray(fileName, fNameList);
+}
+
+//___________________________________________________________________________________________________________________
+
Bool_t AliTRDPreprocessorOffline::ReadGainGlobal(const Char_t* fileName){
//
// read calibration entries from file
}
return kTRUE;
+}
+//_____________________________________________________________________________________________________________
+Bool_t AliTRDPreprocessorOffline::ReadExbAltFitGlobal(const Char_t* fileName){
+ //
+ // read calibration entries from file
+ //
+ if(fAliTRDCalibraExbAltFit) return kTRUE;
+ TFile fcalib(fileName);
+ TObjArray * array = (TObjArray*)fcalib.Get(fNameList);
+ if (array){
+ fAliTRDCalibraExbAltFit = (AliTRDCalibraExbAltFit *) array->FindObject("AliTRDCalibraExbAltFit");
+ //fNEvents = (TH1I *) array->FindObject("NEvents");
+ }else{
+ fAliTRDCalibraExbAltFit = (AliTRDCalibraExbAltFit *) fcalib.Get("AliTRDCalibraExbAltFit");
+ //fNEvents = (TH1I *) fcalib.Get("NEvents");
+ }
+ if(!fAliTRDCalibraExbAltFit) {
+ //printf("No AliTRDCalibraExbAltFit\n");
+ return kFALSE;
+ }
+ return kTRUE;
+
}
//_____________________________________________________________________________________________________________
//
AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
+ calibra->ChooseMethod(fMethodeGain);
+ calibra->SetBeginFitCharge(fBeginFitCharge);
+ calibra->SetFitOutliersChargeLow(fOutliersFitChargeLow);
+ calibra->SetFitOutliersChargeHigh(fOutliersFitChargeHigh);
calibra->SetMinEntries(fMinStatsGain); // If there is less than 1000 entries in the histo: no fit
calibra->AnalyseCH(fCH2d);
AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
calibra->SetCalDetVdriftExB(fCalDetVdriftUsed,fCalDetExBUsed);
calibra->SetMinEntries(fMinStatsVdriftLinear); // If there is less than 1000 entries in the histo: no fit
+ printf("The mean stat is by %d for VdriftLinear\n",fMinStatsVdriftLinear);
//printf("Fill PE Array\n");
- fAliTRDCalibraVdriftLinearFit->FillPEArray();
+ fAliTRDCalibraVdriftLinearFit->SetRobustFit(fRobustFitDriftVelocity);
+ fAliTRDCalibraVdriftLinearFit->SetMinNumberOfPointsForFit(fMinNbOfPointVdriftFit);
+ if(!fAlternativeVdrfitFit)
+ fAliTRDCalibraVdriftLinearFit->FillPEArray();
+ else
+ fAliTRDCalibraVdriftLinearFit->FillPEArray2();
//printf("AliTRDCalibraFit\n");
calibra->AnalyseLinearFitters(fAliTRDCalibraVdriftLinearFit);
//printf("After\n");
if((oldmeanvdrift > 0.0) && (oldmeanexb < 70.0)) {
//printf("Correction factor %f\n",vdriftoverall);
calDetVdrift->Multiply(vdriftoverall/oldmeanvdrift);
- calDetLorentz->Multiply(exboverall/oldmeanexb);
+ if(TMath::Abs(oldmeanexb) > 0.0001) calDetLorentz->Multiply(exboverall/oldmeanexb);
//printf("newmean %f\n",calDetVdrift->CalcMean(kFALSE));
TH1F *coefDriftLinear = calDetVdrift->MakeHisto1DAsFunctionOfDet();
TH1F *coefLorentzAngle = calDetLorentz->MakeHisto1DAsFunctionOfDet();
}
//________________________________________________________________________________________________________________
+Bool_t AliTRDPreprocessorOffline::AnalyzeExbAltFit(){
+ //
+ // Analyze vdrift linear fit - produce the calibration objects
+ //
+
+ //printf("Analyse linear fit\n");
+
+
+ AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
+ calibra->SetMinEntries(fMinStatsVdriftLinear); // If there is less than 1000 entries in the histo: no fit
+ //printf("Fill PE Array\n");
+ fAliTRDCalibraExbAltFit->SetRobustFit(fRobustFitExbAlt);
+ if(!fAlternativeExbAltFit)
+ fAliTRDCalibraExbAltFit->FillPEArray();
+ else
+ fAliTRDCalibraExbAltFit->FillPEArray2();
+ //printf("AliTRDCalibraFit\n");
+ calibra->AnalyseExbAltFit(fAliTRDCalibraExbAltFit);
+ //printf("After\n");
+
+ //Int_t nbtg = 540;
+ Int_t nbfit = calibra->GetNumberFit();
+ Int_t nbE = calibra->GetNumberEnt();
+
+
+ Bool_t ok = kFALSE;
+ // enough statistics
+ if ((nbfit >= 0.5*nbE) && (nbE > 30)) {
+ // create the cal objects
+ //calibra->RemoveOutliers(1,kTRUE);
+ calibra->PutMeanValueOtherVectorFit2(1,kTRUE);
+ //
+ TObjArray object = calibra->GetVectorFit2();
+ AliTRDCalDet *calDetLorentz = calibra->CreateDetObjectExbAlt(&object);
+ TH1F *coefLorentzAngle = calDetLorentz->MakeHisto1DAsFunctionOfDet();
+ //if(!calDetLorentz) printf("No lorentz created\n");
+ // Put them in the array
+ fCalibObjects->AddAt(calDetLorentz,kExbAlt);
+ fPlots->AddAt(coefLorentzAngle,kExbAlt);
+ //
+ ok = kTRUE;
+ }
+
+ calibra->ResetVectorFit();
+
+ return ok;
+
+}
+//________________________________________________________________________________________________________________
+
Bool_t AliTRDPreprocessorOffline::AnalyzePRF(){
//
// Analyze PRF - produce the calibration objects
}
+//_____________________________________________________________________________
+Bool_t AliTRDPreprocessorOffline::AnalyzePHQ(Int_t startRunNumber)
+{
+ //
+ //Produce PHQ calibration results
+ //
+ for(Int_t iter=0; iter<AliTRDdEdxCalibUtils::GetHistArray()->GetSize(); iter++){
+ THnBase *hi = (THnBase*) AliTRDdEdxCalibUtils::GetHistAt(iter);
+ TObjArray *obji = AliTRDdEdxCalibUtils::HistToObj(hi, startRunNumber);
+ //printf("test analyze %s\n", obji->GetName());
+ AliTRDdEdxCalibUtils::GetObjArray()->AddAt(obji, iter);
+ }
+
+ fCalibObjects->AddAt(AliTRDdEdxCalibUtils::GetObjArray(), kPHQ);
+ return kTRUE;
+}
+
//_____________________________________________________________________________
Bool_t AliTRDPreprocessorOffline::AnalyzeChamberStatus()
{
//
// set up AliTRDCalibChamberStatus
- AliTRDCalibChamberStatus *ChamberStatus = new AliTRDCalibChamberStatus();
- ChamberStatus->SetSparseI(fSparse);
- ChamberStatus->AnalyseHisto(fMinStatsChamberStatus);
+ AliTRDCalibChamberStatus *chamberStatus = new AliTRDCalibChamberStatus();
+ chamberStatus->SetSparseI(fSparse);
+ chamberStatus->AnalyseHisto(fMinStatsChamberStatus, fMinSingleStatsChamberStatus);
// get AliTRDCalChamberStatus
- AliTRDCalChamberStatus *CalChamberStatus = ChamberStatus->GetCalChamberStatus();
+ AliTRDCalChamberStatus *calChamberStatus = chamberStatus->GetCalChamberStatus();
// get calibration objects
AliTRDCalDet *calDetGain = (AliTRDCalDet *) fCalibObjects->At(kGain);
AliTRDCalDet *calDetExB = (AliTRDCalDet *) fCalibObjects->At(kLorentzLinear);
// Check
- if((!calDetGain) || (!calDetVDrift) || (!fCH2d) || (!calDetExB) || (!CalChamberStatus)) return kFALSE;
+ if((!calDetGain) || (!calDetVDrift) || (!fCH2d) || (!calDetExB) || (!calChamberStatus)) return kFALSE;
// Gain
Double_t gainmean = calDetGain->GetMean();
Double_t exb = calDetExB->GetValue(idet);
- if( (entries<50 && !CalChamberStatus->IsNoData(idet)) ||
+ if( (entries<50 && !calChamberStatus->IsNoData(idet)) ||
TMath::Abs(gainmean-gain) > (fRMSBadCalibratedGain*gainrms) ||
TMath::Abs(vdriftmean-vdrift) > (fRMSBadCalibratedVdrift*vdriftrms) ||
TMath::Abs(exbmean-exb) > (fRMSBadCalibratedExB*exbrms) ) {
//printf(" vdriftmean %f and vdrift %f, vdriftrms %f \n",vdriftmean,vdrift,vdriftrms);
//printf(" exbmean %f and exb %f, exbrms %f \n",exbmean,exb,exbrms);
- CalChamberStatus->SetStatus(idet,AliTRDCalChamberStatus::kBadCalibrated);
+ calChamberStatus->SetStatus(idet,AliTRDCalChamberStatus::kBadCalibrated);
//counter++;
}
Int_t smbadcalib = 0;
for(Int_t det = 0; det < 30; det++){
Int_t detector = sm*30+det;
- if(CalChamberStatus->IsNoData(detector)) smnodata++;
+ if(calChamberStatus->IsNoData(detector)) smnodata++;
else {
- if(CalChamberStatus->IsBadCalibrated(detector)) smbadcalib++;
+ if(calChamberStatus->IsBadCalibrated(detector)) smbadcalib++;
}
}
fNoData[sm] = smnodata;
// Int_t counter = 0;
// for(Int_t det = 0; det < 30; det++){
// Int_t detector = sm*30+det;
- // if(CalChamberStatus->IsBadCalibrated(detector)) counter++;
+ // if(calChamberStatus->IsBadCalibrated(detector)) counter++;
// }
// if(counter >= 20) {
// for(Int_t det = 0; det < 30; det++){
// Int_t detector = sm*30+det;
- // CalChamberStatus->SetStatus(detector,AliTRDCalChamberStatus::kGood);
+ // calChamberStatus->SetStatus(detector,AliTRDCalChamberStatus::kGood);
// }
// }
// }
- fCalibObjects->AddAt(CalChamberStatus,kChamberStatus);
+ fCalibObjects->AddAt(calChamberStatus,kChamberStatus);
return kTRUE;
}
AliCDBMetaData *metaData= new AliCDBMetaData();
metaData->SetObjectClassName("AliTRDCalDet");
metaData->SetResponsible("Raphaelle Bailhache");
+ metaData->AddDateToComment();
metaData->SetBeamPeriod(1);
AliCDBId id1("TRD/Calib/ChamberGainFactor", startRunNumber, endRunNumber);
AliCDBMetaData *metaData= new AliCDBMetaData();
metaData->SetObjectClassName("AliTRDCalDet");
metaData->SetResponsible("Raphaelle Bailhache");
+ metaData->AddDateToComment();
metaData->SetBeamPeriod(1);
AliCDBId id1("TRD/Calib/ChamberExB", startRunNumber, endRunNumber);
//if(!calDet) printf("No caldet\n");
}
+//___________________________________________________________________________________________________________________
+void AliTRDPreprocessorOffline::UpdateOCDBExBAlt(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
+ //
+ // Update OCDB entry
+ //
+
+ Int_t detExB = kExbAlt;
+ if(!fMethodSecond) return;
+
+ //printf("Pass\n");
+
+ AliCDBMetaData *metaData= new AliCDBMetaData();
+ metaData->SetObjectClassName("AliTRDCalDet");
+ metaData->SetResponsible("Theo Rascanu");
+ metaData->AddDateToComment();
+ metaData->SetBeamPeriod(1);
+
+ AliCDBId id1("TRD/Calib/ChamberExBAlt", startRunNumber, endRunNumber);
+ AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
+ AliTRDCalDet *calDet = (AliTRDCalDet *) fCalibObjects->At(detExB);
+ if(calDet) gStorage->Put(calDet, id1, metaData);
+ //if(!calDet) printf("No caldet\n");
+
+}
//___________________________________________________________________________________________________________________
void AliTRDPreprocessorOffline::UpdateOCDBVdrift(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
//
AliCDBMetaData *metaData= new AliCDBMetaData();
metaData->SetObjectClassName("AliTRDCalDet");
metaData->SetResponsible("Raphaelle Bailhache");
+ metaData->AddDateToComment();
metaData->SetBeamPeriod(1);
AliCDBId id1("TRD/Calib/ChamberVdrift", startRunNumber, endRunNumber);
AliCDBMetaData *metaDataPad= new AliCDBMetaData();
metaDataPad->SetObjectClassName("AliTRDCalPad");
metaDataPad->SetResponsible("Raphaelle Bailhache");
+ metaDataPad->AddDateToComment();
metaDataPad->SetBeamPeriod(1);
AliCDBId id1Pad("TRD/Calib/LocalVdrift", startRunNumber, endRunNumber);
AliCDBMetaData *metaData= new AliCDBMetaData();
metaData->SetObjectClassName("AliTRDCalDet");
metaData->SetResponsible("Raphaelle Bailhache");
+ metaData->AddDateToComment();
metaData->SetBeamPeriod(1);
AliCDBId id1("TRD/Calib/ChamberT0", startRunNumber, endRunNumber);
AliCDBMetaData *metaDataPad= new AliCDBMetaData();
metaDataPad->SetObjectClassName("AliTRDCalPad");
metaDataPad->SetResponsible("Raphaelle Bailhache");
+ metaDataPad->AddDateToComment();
metaDataPad->SetBeamPeriod(1);
AliCDBId id1Pad("TRD/Calib/LocalT0", startRunNumber, endRunNumber);
AliCDBMetaData *metaData= new AliCDBMetaData();
metaData->SetObjectClassName("AliTRDCalPad");
metaData->SetResponsible("Raphaelle Bailhache");
+ metaData->AddDateToComment();
metaData->SetBeamPeriod(1);
+
AliCDBId id1("TRD/Calib/PRFWidth", startRunNumber, endRunNumber);
AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
AliTRDCalPad *calPad = (AliTRDCalPad *) fCalibObjects->At(kPRF);
}
+//_________________________________________________________________________________________________________________
+void AliTRDPreprocessorOffline::UpdateOCDBPHQ(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath)
+{
+ //
+ // Update OCDB entry
+ //
+ AliCDBMetaData *metaData= new AliCDBMetaData();
+ metaData->SetObjectClassName("TObjArray");
+ metaData->SetResponsible("Raphaelle Bailhache and Xianguo Lu");
+ metaData->AddDateToComment();
+ metaData->SetBeamPeriod(1);
+
+ AliCDBId id1("TRD/Calib/PHQ", startRunNumber, endRunNumber);
+ AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
+ TObjArray *cobj = (TObjArray *) fCalibObjects->At(kPHQ);
+ if(cobj){
+ //cobj->Print();
+ gStorage->Put(cobj, id1, metaData);
+ }
+}
+
//_________________________________________________________________________________________________________________
void AliTRDPreprocessorOffline::UpdateOCDBChamberStatus(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
//
AliCDBMetaData *metaData= new AliCDBMetaData();
metaData->SetObjectClassName("AliTRDCalChamberStatus");
- metaData->SetResponsible("Raphaelle Bailhache");
+ metaData->SetResponsible("Raphaelle Bailhache and Julian Book");
+ metaData->AddDateToComment();
metaData->SetBeamPeriod(1);
AliCDBId id1("TRD/Calib/ChamberStatus", startRunNumber, endRunNumber);