]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDPreprocessorOffline.cxx
updated from Leticia
[u/mrichter/AliRoot.git] / TRD / AliTRDPreprocessorOffline.cxx
index 98901a13bd5d1b663f579e1f660844472a4e5d9e..c6e0ccce7c08d777d05e577b4b27b2cf22ad3b00 100644 (file)
@@ -65,7 +65,9 @@
 #include "AliTRDCommonParam.h"
 #include "AliCDBManager.h"
 #include "AliCDBEntry.h"
-
+#include "AliTRDdEdxBaseUtils.h"
+#include "AliTRDdEdxCalibHistArray.h"
+#include "AliTRDdEdxCalibUtils.h"
 
 ClassImp(AliTRDPreprocessorOffline)
 
@@ -105,17 +107,29 @@ ClassImp(AliTRDPreprocessorOffline)
   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),
+  fDebugPHQon(kFALSE)
 {
   //
   // default constructor
@@ -137,6 +151,12 @@ AliTRDPreprocessorOffline::~AliTRDPreprocessorOffline() {
   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;
@@ -157,9 +177,19 @@ void AliTRDPreprocessorOffline::Process(const Char_t* file, Int_t startRunNumber
     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();
   
 }
@@ -332,6 +362,27 @@ void AliTRDPreprocessorOffline::CalibPRF(const Char_t* file, Int_t startRunNumbe
   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){
@@ -414,7 +465,7 @@ Bool_t AliTRDPreprocessorOffline::Init(const Char_t* fileName){
    
   if(fVersionVdriftUsed == 0) fStatusPos = fStatusPos |kVdriftErrorOld;
   if(fVersionGainUsed == 0) fStatusPos = fStatusPos | kGainErrorOld;
+
   return kTRUE;
   
 }
@@ -439,6 +490,17 @@ Bool_t AliTRDPreprocessorOffline::ReadStatusGlobal(const Char_t* fileName){
 }
 //___________________________________________________________________________________________________________________
 
+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
@@ -570,6 +632,10 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeGain(){
   //
 
   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);
 
@@ -705,8 +771,14 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeVdriftLinearFit(){
   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");
@@ -757,7 +829,7 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeVdriftLinearFit(){
       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();
@@ -800,7 +872,11 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeExbAltFit(){
   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->FillPEArray();
+  fAliTRDCalibraExbAltFit->SetRobustFit(fRobustFitExbAlt);
+  if(!fAlternativeExbAltFit)
+    fAliTRDCalibraExbAltFit->FillPEArray();
+  else
+    fAliTRDCalibraExbAltFit->FillPEArray2();
   //printf("AliTRDCalibraFit\n");
   calibra->AnalyseExbAltFit(fAliTRDCalibraExbAltFit);
   //printf("After\n");
@@ -871,6 +947,44 @@ Bool_t AliTRDPreprocessorOffline::AnalyzePRF(){
   
 }
 
+//_____________________________________________________________________________
+Bool_t AliTRDPreprocessorOffline::AnalyzePHQ(Int_t startRunNumber)
+{
+  //
+  //Produce PHQ calibration results
+  //
+  TList *lout = 0x0;
+  TTreeSRedirector *calibStream = 0x0;
+  if(IsDebugPHQon()){
+    lout = new TList;
+    lout->SetOwner();
+
+    calibStream = new TTreeSRedirector(Form("TRDCalibStream_%010d.root", startRunNumber));
+  }
+
+  for(Int_t iter=0; iter<AliTRDdEdxCalibUtils::GetHistArray()->GetSize(); iter++){
+    THnBase *hi = (THnBase*) AliTRDdEdxCalibUtils::GetHistAt(iter);
+    TObjArray *obji = AliTRDdEdxCalibUtils::HistToObj(hi, startRunNumber, lout, calibStream);
+    //printf("test analyze %s\n", obji->GetName());
+    AliTRDdEdxCalibUtils::GetObjArray()->AddAt(obji, iter);
+  }
+
+  fCalibObjects->AddAt(AliTRDdEdxCalibUtils::GetObjArray(), kPHQ);
+
+  if(lout){
+    TFile *fout=new TFile(Form("TRDCalibList_%010d.root", startRunNumber),"recreate");
+    fout->cd();
+    lout->Write();
+    fout->Save();
+    fout->Close();
+    delete fout;
+  }
+  delete calibStream;
+  delete lout;
+
+  return kTRUE;
+}
+
 //_____________________________________________________________________________
 Bool_t AliTRDPreprocessorOffline::AnalyzeChamberStatus()
 {
@@ -879,11 +993,11 @@ 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);
@@ -891,7 +1005,7 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeChamberStatus()
   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();
@@ -928,7 +1042,7 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeChamberStatus()
     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) ) {
@@ -938,7 +1052,7 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeChamberStatus()
       //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++;
     }
 
@@ -952,9 +1066,9 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeChamberStatus()
     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;
@@ -967,17 +1081,17 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeChamberStatus()
   //     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;
 
  }
@@ -1085,6 +1199,7 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeChamberStatus()
    AliCDBMetaData *metaData= new AliCDBMetaData();
    metaData->SetObjectClassName("AliTRDCalDet");
    metaData->SetResponsible("Raphaelle Bailhache");
+   metaData->AddDateToComment();
    metaData->SetBeamPeriod(1);
 
    AliCDBId id1("TRD/Calib/ChamberGainFactor", startRunNumber, endRunNumber);
@@ -1108,6 +1223,7 @@ Bool_t AliTRDPreprocessorOffline::AnalyzeChamberStatus()
    AliCDBMetaData *metaData= new AliCDBMetaData();
    metaData->SetObjectClassName("AliTRDCalDet");
    metaData->SetResponsible("Raphaelle Bailhache");
+   metaData->AddDateToComment();
    metaData->SetBeamPeriod(1);
 
    AliCDBId id1("TRD/Calib/ChamberExB", startRunNumber, endRunNumber);
@@ -1130,7 +1246,8 @@ void AliTRDPreprocessorOffline::UpdateOCDBExBAlt(Int_t startRunNumber, Int_t end
 
   AliCDBMetaData *metaData= new AliCDBMetaData();
   metaData->SetObjectClassName("AliTRDCalDet");
-  metaData->SetResponsible("Raphaelle Bailhache");
+  metaData->SetResponsible("Theo Rascanu");
+  metaData->AddDateToComment();
   metaData->SetBeamPeriod(1);
 
   AliCDBId id1("TRD/Calib/ChamberExBAlt", startRunNumber, endRunNumber);
@@ -1153,6 +1270,7 @@ void AliTRDPreprocessorOffline::UpdateOCDBExBAlt(Int_t startRunNumber, Int_t end
    AliCDBMetaData *metaData= new AliCDBMetaData();
    metaData->SetObjectClassName("AliTRDCalDet");
    metaData->SetResponsible("Raphaelle Bailhache");
+   metaData->AddDateToComment();
    metaData->SetBeamPeriod(1);
 
    AliCDBId id1("TRD/Calib/ChamberVdrift", startRunNumber, endRunNumber);
@@ -1167,6 +1285,7 @@ void AliTRDPreprocessorOffline::UpdateOCDBExBAlt(Int_t startRunNumber, Int_t end
      AliCDBMetaData *metaDataPad= new AliCDBMetaData();
      metaDataPad->SetObjectClassName("AliTRDCalPad");
      metaDataPad->SetResponsible("Raphaelle Bailhache");
+     metaDataPad->AddDateToComment();
      metaDataPad->SetBeamPeriod(1);
 
      AliCDBId id1Pad("TRD/Calib/LocalVdrift", startRunNumber, endRunNumber);
@@ -1185,6 +1304,7 @@ void AliTRDPreprocessorOffline::UpdateOCDBExBAlt(Int_t startRunNumber, Int_t end
    AliCDBMetaData *metaData= new AliCDBMetaData();
    metaData->SetObjectClassName("AliTRDCalDet");
    metaData->SetResponsible("Raphaelle Bailhache");
+   metaData->AddDateToComment();
    metaData->SetBeamPeriod(1);
 
    AliCDBId id1("TRD/Calib/ChamberT0", startRunNumber, endRunNumber);
@@ -1197,6 +1317,7 @@ void AliTRDPreprocessorOffline::UpdateOCDBExBAlt(Int_t startRunNumber, Int_t end
    AliCDBMetaData *metaDataPad= new AliCDBMetaData();
    metaDataPad->SetObjectClassName("AliTRDCalPad");
    metaDataPad->SetResponsible("Raphaelle Bailhache");
+   metaDataPad->AddDateToComment();
    metaDataPad->SetBeamPeriod(1);
 
    AliCDBId id1Pad("TRD/Calib/LocalT0", startRunNumber, endRunNumber);
@@ -1215,8 +1336,10 @@ void AliTRDPreprocessorOffline::UpdateOCDBExBAlt(Int_t startRunNumber, Int_t end
    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);
@@ -1224,6 +1347,27 @@ void AliTRDPreprocessorOffline::UpdateOCDBExBAlt(Int_t startRunNumber, Int_t end
 
 
  }
+//_________________________________________________________________________________________________________________
+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){
    //
@@ -1232,7 +1376,8 @@ void AliTRDPreprocessorOffline::UpdateOCDBExBAlt(Int_t startRunNumber, Int_t end
 
    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);