#include "AliTRDdEdxCalibHistArray.h"
#include "AliTRDdEdxCalibUtils.h"
-#define EPSILON 1e-12
+#define EPSILON 1e-8
AliTRDdEdxCalibHistArray * AliTRDdEdxCalibUtils::fgHistArray = 0x0;
TObjArray * AliTRDdEdxCalibUtils::fgObjArray = 0x0;
}
}
-Bool_t AliTRDdEdxCalibUtils::GenerateDefaultOCDB(const TString path)
+Bool_t AliTRDdEdxCalibUtils::GenerateOCDB(const Int_t run, const TString path)
{
//
- //generate default OCDB object PHQ, do like
- //AliTRDdEdxCalibUtils::GenerateDefaultPHQOCDB("local://./")
+ //generate OCDB object PHQ, do like
+ //AliTRDdEdxCalibUtils::GenerateOCDB(run, "local://./")
+ //if fgObjArray==0x0, generate default one
+ //else generate according to fgObjArray
//
- TObjArray * arr8 = new TObjArray(8);
- arr8->SetOwner();
-
- for(Int_t ii=0; ii<8; ii++){
- TObjArray * arr1 = new TObjArray(1);
- arr1->SetOwner();
- TString objn(AliTRDdEdxCalibHistArray::GetNameAt(ii));
- objn.ReplaceAll("Hist","Obj");
- arr1->SetName(objn);
-
- const Int_t nbins = AliTRDdEdxBaseUtils::NTRDtimebin();
- TVectorD * vec = new TVectorD(nbins);
- for(Int_t jj=0; jj<nbins; jj++){
- (*vec)[jj] = 1;
+ TObjArray * arr8 = 0x0;
+ if(fgObjArray){
+ arr8 = fgObjArray;
+ }
+ else{
+ arr8 = new TObjArray(8);
+ arr8->SetOwner();
+
+ for(Int_t ii=0; ii<8; ii++){
+ TObjArray * arr1 = new TObjArray(1);
+ arr1->SetOwner();
+ TString objn(AliTRDdEdxCalibHistArray::GetNameAt(ii));
+ objn.ReplaceAll("Hist","Obj");
+ arr1->SetName(objn);
+
+ const Int_t nbins = AliTRDdEdxBaseUtils::NTRDtimebin();
+ TVectorD * vec = new TVectorD(nbins);
+ for(Int_t jj=0; jj<nbins; jj++){
+ (*vec)[jj] = 1;
+ }
+ arr1->Add(vec);
+ arr8->Add(arr1);
}
- arr1->Add(vec);
- arr8->Add(arr1);
}
AliCDBMetaData *metaData= new AliCDBMetaData();
metaData->SetObjectClassName("TObjArray");
metaData->SetResponsible("Raphaelle Bailhache and Xianguo Lu");
- AliCDBId id1("TRD/Calib/PHQ", 0, 999999999);
+ AliCDBId id1("TRD/Calib/PHQ", run<0? 0 : run , run<0 ? 999999999 : run);
AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(path);
gStorage->Put(arr8, id1, metaData);
if(!hcalib){printf("AliTRDdEdxCalibUtils::FillCalibHist errro hcalib null!!\n"); exit(1);}
for(Int_t ii=0; ii<ncls; ii++){
- const Double_t dq = (*arrayQ)[ii];
- const Double_t xx = (*arrayX)[ii];
-
+ Double_t dq = (*arrayQ)[ii]/scale;
+ const Double_t qmin = hcalib->GetAxis(1)->GetXmin() +0.5 * hcalib->GetAxis(1)->GetBinWidth(1);
const Double_t qmax = hcalib->GetAxis(1)->GetXmax() -0.5 * hcalib->GetAxis(1)->GetBinWidth(1);
+
+ if(dq<qmin)
+ dq = qmin;
+ if(dq>qmax)
+ dq = qmax;
+
+ const Double_t xx = (*arrayX)[ii];
const Double_t xmin = hcalib->GetAxis(0)->GetXmin();
const Double_t xmax = hcalib->GetAxis(0)->GetXmax();
printf("AliTRDdEdxCalibUtils::FillCalibHist error x overflow or underflow! %s %15f %15f %15f\n", hcalib->GetName(), xx, xmin, xmax); exit(1);
}
- const Double_t var[]={xx, TMath::Min(dq, qmax)/scale};
+ const Double_t var[]={xx, dq};
hcalib->Fill(var);
}
}
if(tpcsig<EPSILON)
return -999;
- return tpcsig/120;
+ return tpcsig/45;
}
delete obj;
}
-void AliTRDdEdxCalibUtils::Output(const TList *lin, Int_t run)
-{
- //
- //produce calibration objects
- //
-
- TString objnames;
- for(Int_t iter=0; iter<8; iter++){
- objnames+= AliTRDdEdxCalibHistArray::GetNameAt(iter)+" ";
- }
-
- TList * lout = new TList;
- lout->SetOwner();
-
- TTreeSRedirector *calibStream = new TTreeSRedirector(Form("TRDCalibStream_%010d.root", run));
-
- const Int_t nh=lin->GetEntries();
- for(Int_t ii=0; ii<nh; ii++){
- const THnBase *hh=(THnBase*)lin->At(ii);
- const TString hname = hh->GetName();
- if(!objnames.Contains(hname))
- continue;
-
- TObjArray * cobj0 = HistToObj(hh, run, lout, calibStream);
- lout->Add(cobj0);
- }
-
- //lout->ls();
-
- //=============================================================
- //=============================================================
-
- TFile *fout=new TFile(Form("TRDCalibObj_%010d.root", run),"recreate");
- fout->cd();
- const Int_t nout=lout->GetEntries();
- for(Int_t ii=0; ii<nout; ii++){
- const TString oname = lout->At(ii)->GetName();
- if(oname.Contains("Obj")){
- TObjArray * cobj = (TObjArray*) lout->At(ii);
- cobj->Write(oname, TObjArray::kSingleKey);
- }
- }
- fout->Save();
- fout->Close();
- delete fout;
-
- fout=new TFile(Form("TRDCalibList_%010d.root", run),"recreate");
- fout->cd();
- lin->Write();
- lout->Write();
- fout->Save();
- fout->Close();
- delete fout;
-
- delete calibStream;
-
/*
http://root.cern.ch/root/html/TH1.html
When an histogram is created, a reference to it is automatically added to the list of in-memory objects for the current file or directory. This default behaviour can be changed by:
When the histogram is deleted, the reference to it is removed from the list of objects in memory. When a file is closed, all histograms in memory associated with this file are automatically deleted.
*/
- delete lout;
-}
TObjArray* AliTRDdEdxCalibUtils::HistToObj(const THnBase *hh, Int_t run, TList *lout, TTreeSRedirector *calibStream)
{