#include "AliTPCCalibVdrift.h"
#include "AliMathBase.h"
#include "AliRelAlignerKalman.h"
+#include "TTree.h"
+#include "TROOT.h"
+#include "TKey.h"
const Float_t kAlmost0=1.e-30;
stat(ipar,1)=TMath::Median(naccept, valArray[ipar]->GetMatrixArray());
stat(ipar,2)=TMath::RMS(naccept, valArray[ipar]->GetMatrixArray());
}
+ for (Int_t i=0; i<9; i++){
+ delete valArray[i];
+ }
return pstat;
}
return array;
}
+
+//_____________________________________________________________________________________
+TTree* AliTPCcalibDButil::ConnectGainTrees(TString baseDir)
+{
+ //
+ // baseDir: Base directory with the raw Kr calibration trees
+ // and the trees from the calibQA
+ // it assumes to following structure below:
+ // KryptonCalib/<year>/calibKr/calibKr.<year>.<id>.root
+ // calibQAdEdx/<year>/calibQA.<year>.<perid>.tree.root
+ // map/treeMapping.root
+ //
+
+
+ // === add main tree, which will be a mapping file ================
+ TFile *fin = TFile::Open(Form("%s/map/treeMapping.root",baseDir.Data()));
+ gROOT->cd();
+ TTree *tMain = (TTree*)fin->Get("calPads");
+ tMain->SetAlias("Pad0","MapPadLength.fElements==7.5"); // pad types
+ tMain->SetAlias("Pad1","MapPadLength.fElements==10.0");
+ tMain->SetAlias("Pad2","MapPadLength.fElements==15.0");
+ //
+ tMain->SetAlias("dRowNorm0","(row.fElements/32-1)"); // normalized distance to the center of the chamber in lx (-1,1)
+ tMain->SetAlias("dRowNorm1","(row.fElements/32-1)"); //
+ tMain->SetAlias("dRowNorm2","((row.fElements-63)/16-1)"); //
+ tMain->SetAlias("dRowNorm","(row.fElements<63)*(row.fElements/32-1)+(row.fElements>63)*((row.fElements-63)/16-1)");
+ tMain->SetAlias("dPhiNorm","(ly.fElements/lx.fElements)/(pi/18)"); // normalized distance to the center of the chamber in phi (-1,1)
+ //
+ tMain->SetAlias("fsector","(sector%36)+(0.5+9*atan2(ly.fElements,lx.fElements)/pi)"); // float sector number
+ tMain->SetAlias("posEdge","((pi/18.)-abs(atan(ly.fElements/lx.fElements)))*lx.fElements"); //distance to the edge
+
+ // === add the krypton calibration trees ==========================
+ TString inputTreesKrCalib = gSystem->GetFromPipe(Form("ls %s/KryptonCalib/20*/calibKr/*.tree.root",baseDir.Data()));
+ TObjArray *arrInputTreesKrCalib = inputTreesKrCalib.Tokenize("\n");
+
+ for (Int_t itree=0; itree<arrInputTreesKrCalib->GetEntriesFast(); ++itree) {
+ TFile *fin2 = TFile::Open(arrInputTreesKrCalib->At(itree)->GetName());
+ TTree *tin = (TTree*)fin2->Get("calPads");
+ gROOT->cd();
+ TString friendName=gSystem->BaseName(arrInputTreesKrCalib->At(itree)->GetName());
+ friendName.ReplaceAll("calibKr.","");
+ friendName.ReplaceAll(".tree.root","");
+ friendName="Kr."+friendName;
+ tMain->AddFriend(tin,friendName.Data());
+
+ // set aliases
+
+ // TODO: finish implementation of alias via lists
+// const Int_t nbranchAlias = 2;
+// const char* branchNames[nbranchAlias]={"spectrMean","fitMean"};
+// const Int_t nbranchStat = 2;
+// const char* statNames[nbranchStat] = {"Median","LTM"};
+//
+// for (Int_t iname=0; iname<nbranchAlias; ++iname) {
+// TString branchName = TString::Format("%s.%s", friendName.Data(), bNames[i]);
+//
+// for (Int_t istat=0; istat<nbranchStat; ++istat) {
+//
+// }
+// }
+
+ tMain->SetAlias((friendName+".spectrMean_LTMRatio").Data(),
+ TString::Format("(%s.spectrMean.fElements/(%s.spectrMean_LTM+0))",
+ friendName.Data(),friendName.Data()).Data());
+
+ tMain->SetAlias((friendName+".spectrMean_MedianRatio").Data(),
+ TString::Format("(%s.spectrMean.fElements/(%s.spectrMean_Median+0))",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".spectrMean_MeanRatio").Data(),
+ TString::Format("(%s.spectrMean.fElements/(%s.spectrMean_Mean+0))",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".spectrMean_MeanRatio").Data(),
+ TString::Format("(%s.spectrMean.fElements/%s.spectrMean_Mean)",
+ friendName.Data(),friendName.Data()).Data());
+
+ tMain->SetAlias((friendName+".fitMean_LTMRatio").Data(),
+ TString::Format("(%s.fitMean.fElements/(%s.fitMean_LTM+0))",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".fitRMS_LTMRatio").Data(),
+ TString::Format("(%s.fitRMS.fElements/(%s.fitRMS_LTM+0))",
+ friendName.Data(),friendName.Data()).Data());
+
+ tMain->SetAlias((friendName+".fitMean_MedianRatio").Data(),
+ TString::Format("(%s.fitMean.fElements/(%s.fitMean_Median+0))",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".fitRMS_MedianRatio").Data(),
+ TString::Format("(%s.fitRMS.fElements/(%s.fitRMS_Median+0))",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".fitMean_MeanRatio").Data(),
+ TString::Format("(%s.fitMean.fElements/(%s.fitMean_Mean+0))",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".fitRMS_MeanRatio").Data(),
+ TString::Format("(%s.fitRMS.fElements/(%s.fitRMS_Mean+0))",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".fitMean_MeanRatio").Data(),
+ TString::Format("(%s.fitMean.fElements/%s.fitMean_Mean)",
+ friendName.Data(),friendName.Data()).Data());
+
+ }
+
+ // === add the calibQA trees ======================================
+ TString inputTreesQACalib = gSystem->GetFromPipe(Form("ls %s/calibQAdEdx/20*/*.tree.root",baseDir.Data()));
+ TObjArray *arrInputTreesQACalib = inputTreesQACalib.Tokenize("\n");
+
+ for (Int_t itree=0; itree<arrInputTreesQACalib->GetEntriesFast(); ++itree) {
+ TFile *fin2 = TFile::Open(arrInputTreesQACalib->At(itree)->GetName());
+ TTree *tin = (TTree*)fin2->Get("calPads");
+ gROOT->cd();
+ TString friendName=gSystem->BaseName(arrInputTreesQACalib->At(itree)->GetName());
+ friendName.ReplaceAll("calibQA.","");
+ friendName.ReplaceAll(".tree.root","");
+ friendName="QA."+friendName;
+ tMain->AddFriend(tin,friendName.Data());
+
+ // set aliases
+ tMain->SetAlias((friendName+".MaxCharge_LTMRatio").Data(),
+ TString::Format("(%s.MaxCharge.fElements/%s.MaxCharge_LTM)",
+ friendName.Data(),friendName.Data()).Data());
+
+ tMain->SetAlias((friendName+".MaxCharge_MedianRatio").Data(),
+ TString::Format("(%s.MaxCharge.fElements/%s.MaxCharge_Median)",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".MaxCharge_MeanRatio").Data(),
+ TString::Format("(%s.MaxCharge.fElements/%s.MaxCharge_Mean)",
+ friendName.Data(),friendName.Data()).Data());
+
+ tMain->SetAlias((friendName+".MeanCharge_LTMRatio").Data(),
+ TString::Format("(%s.MeanCharge.fElements/%s.MeanCharge_LTM)",
+ friendName.Data(),friendName.Data()).Data());
+
+ tMain->SetAlias((friendName+".MeanCharge_MedianRatio").Data(),
+ TString::Format("(%s.MeanCharge.fElements/%s.MeanCharge_Median)",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".MeanCharge_MeanRatio").Data(),
+ TString::Format("(%s.MeanCharge.fElements/%s.MeanCharge_Mean)",
+ friendName.Data(),friendName.Data()).Data());
+
+ }
+
+ return tMain;
+}
+
+
+//_____________________________________________________________________________________
+TTree* AliTPCcalibDButil::ConnectPulserTrees(TString baseDir, TTree *tMain)
+{
+ //
+ // baseDir: Base directory with Pulser information
+ // TTrees are added to the base tree as a friend tree
+ //
+ // === add the calibPulser trees ======================================
+ TString inputTreesPulserCalib = gSystem->GetFromPipe(Form("ls %s/calibPulser/20*/*.tree.root",baseDir.Data()));
+ TObjArray *arrInputTreesPulserCalib = inputTreesPulserCalib.Tokenize("\n");
+ for (Int_t itree=0; itree<arrInputTreesPulserCalib->GetEntriesFast(); ++itree) {
+ TFile *fin2 = TFile::Open(arrInputTreesPulserCalib->At(itree)->GetName());
+ TTree *tin = (TTree*)fin2->Get("calPads");
+ gROOT->cd();
+ TString friendName=gSystem->BaseName(arrInputTreesPulserCalib->At(itree)->GetName());
+ friendName.ReplaceAll("calibPulser.","");
+ friendName.ReplaceAll(".tree.root","");
+ friendName="Pulser."+friendName;
+ tMain->AddFriend(tin,friendName.Data());
+ // set aliases
+
+ tMain->SetAlias((friendName+".CEQmean_LTMRatio").Data(),
+ TString::Format("(%s.CEQmean.fElements/%s.CEQmean_LTM)",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".CEQmean_MedianRatio").Data(),
+ TString::Format("(%s.CEQmean.fElements/%s.CEQmean_Median)",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".CEQmean_MeanRatio").Data(),
+ TString::Format("(%s.CEQmean.fElements/%s.CEQmean_Mean)",
+ friendName.Data(),friendName.Data()).Data());
+ //
+ tMain->SetAlias((friendName+".CETmean_LTMDelta").Data(),
+ TString::Format("(%s.CETmean.fElements-%s.CETmean_LTM)",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".CETmean_MedianDelta").Data(),
+ TString::Format("(%s.CETmean.fElements-%s.CETmean_Median)",
+ friendName.Data(),friendName.Data()).Data());
+ tMain->SetAlias((friendName+".CETmean_MeanDelta").Data(),
+ TString::Format("(%s.CETmean.fElements-%s.CETmean_Mean)",
+ friendName.Data(),friendName.Data()).Data());
+ }
+ return tMain;
+}
+
+
+TTree* AliTPCcalibDButil::ConnectDistortionTrees(TString baseDir, TString selection, TTree *tMain){
+ //
+ // baseDir: Base directory with Distortion information
+ // TTrees are added to the base tree as a friend tree
+ // If base tree not provide - first tree from list is used as base
+ //
+ // === add the calibDistortion trees ======================================
+ //TString inputTreesDistortionCalib = gSystem->GetFromPipe(Form("ls %s/calibDistortion/20*/*.tree.root",baseDir.Data()));
+ // TString baseDir="$NOTES/reconstruction/distortionFit/"; TTree *tMain=0;
+ // AliTPCcalibDButil::ConnectDistortionTrees("$NOTES/reconstruction/distortionFit/", "calibTimeResHisto.root", 0);
+
+ TString inputTreesDistortionCalib = "";
+ if (selection.Contains(".list")){
+ inputTreesDistortionCalib=gSystem->GetFromPipe(Form("cat %s",selection.Data()));
+ }else{
+ inputTreesDistortionCalib=gSystem->GetFromPipe(Form("find %s -iname \"%s\"",baseDir.Data(),selection.Data()));
+ }
+ TObjArray *arrInputTreesDistortionCalib = inputTreesDistortionCalib.Tokenize("\n");
+ //
+ for (Int_t itree=0; itree<arrInputTreesDistortionCalib->GetEntriesFast(); ++itree) {
+ TFile *finput= TFile::Open(arrInputTreesDistortionCalib->At(itree)->GetName());
+ TString strFile=arrInputTreesDistortionCalib->At(itree)->GetName();
+ TObjArray *path=strFile.Tokenize("/");
+ Int_t plength=path->GetEntries();
+ if (!finput) continue;
+ TList* list = finput->GetListOfKeys();
+ Int_t nkeys=list->GetEntries();
+ for (Int_t ikey=0; ikey<nkeys; ikey++){
+ TKey * key = (TKey*)list->At(ikey);
+ if (strstr(key->GetClassName(),"TTree")==0) continue;
+ TTree * tree = dynamic_cast<TTree*>(finput->Get(list->At(ikey)->GetName()));
+ if (!tree) continue;
+ TString friendName=TString::Format("%s.%s.%s",path->At(plength-3)->GetName(),path->At(plength-2)->GetName(), tree->GetName());
+ ::Info("AliTPCcalibDButil::ConnectDistortionTrees","%s",friendName.Data());
+ if (tMain==0) tMain=tree;
+ tMain->AddFriend(tree,friendName.Data());
+ }
+ }
+ // tMain->SetAlias("");
+ return tMain;
+}
+
+
+//_____________________________________________________________________________________
+TTree* AliTPCcalibDButil::ConnectCalPadTrees(TString baseDir, TString pattern, TTree *tMain, Bool_t checkAliases)
+{
+ //
+ // baseDir: Base directory with per Pad information
+ // TTrees are added to the base tree as a friend tree
+ // Example usage
+ // TString baseDir="/hera/alice/fsozzi/summarymaps/calib2/"; // prefix directory with calibration with slash at the end
+ // TString pattern="QA/*/*root";
+ // TTree * tree = AliTPCcalibDButil::ConnectCalPadTrees(baseDir,pattern,0); //create tree and attach calibration as friends
+
+ //
+ // === add the calibPulser trees ======================================
+ TString inputTreesCalPad = gSystem->GetFromPipe(Form("ls %s/%s",baseDir.Data(), pattern.Data()));
+ TObjArray *arrInputTreesCalPad = inputTreesCalPad.Tokenize("\n");
+ //
+ for (Int_t itree=0; itree<arrInputTreesCalPad->GetEntriesFast(); ++itree) {
+ TFile *fin2 = TFile::Open(arrInputTreesCalPad->At(itree)->GetName());
+ TTree *tin = (TTree*)fin2->Get("calPads");
+ gROOT->cd();
+ TString friendName=arrInputTreesCalPad->At(itree)->GetName();
+ friendName.ReplaceAll("//","/");
+ friendName.ReplaceAll(baseDir.Data(),"");
+ friendName.ReplaceAll("^/","");
+ friendName.ReplaceAll("/",".");
+ friendName.ReplaceAll(".tree.",".");
+ friendName.ReplaceAll(".root","");
+ printf("%s\n", friendName.Data());
+ ::Info("AliTPCcalibDButil::ConnectCalPadTrees","%s",friendName.Data());
+ if (tMain==0) tMain=tin;
+ tMain->AddFriend(tin,friendName.Data());
+ TObjArray * branches=tin->GetListOfBranches();
+ Int_t nBranches=branches->GetEntries();
+ for (Int_t ibranch=0; ibranch<nBranches; ibranch++){
+ TString bname=branches->At(ibranch)->GetName();
+ if (bname.Contains(".")>0){
+ bname.ReplaceAll(".","");
+ // replace elements
+ tin->SetAlias((bname).Data(), (bname+".fElements").Data());
+ tMain->SetAlias((friendName+"."+bname).Data(), (friendName+"."+bname+".fElements").Data());
+ //
+ // make normalized values per chamber
+ //
+ if (branches->FindObject(bname+"_LTM")!=0){
+ tMain->SetAlias((friendName+"."+bname+"_MeanRatio").Data(), (friendName+"."+bname+".fElements/"+friendName+"."+bname+"_Mean").Data());
+ tMain->SetAlias((friendName+"."+bname+"_MedianRatio").Data(), (friendName+"."+bname+".fElements/"+friendName+"."+bname+"_Median").Data());
+ tMain->SetAlias((friendName+"."+bname+"_LTMRatio").Data(), (friendName+"."+bname+".fElements/"+friendName+"."+bname+"_LTM").Data());
+ tMain->SetAlias((friendName+"."+bname+"_MeanDelta").Data(), (friendName+"."+bname+".fElements-"+friendName+"."+bname+"_Mean").Data());
+ tMain->SetAlias((friendName+"."+bname+"_MedianDelta").Data(), (friendName+"."+bname+".fElements-"+friendName+"."+bname+"_Median").Data());
+ tMain->SetAlias((friendName+"."+bname+"_LTMDelta").Data(), (friendName+"."+bname+".fElements-"+friendName+"."+bname+"_LTM").Data());
+ }
+ // if (branches->FindObject(bname+"_Med3.")!=0){
+ tMain->SetAlias((friendName+"."+bname+"_Med3Ratio").Data(), (friendName+"."+bname+".fElements/"+friendName+"."+bname+"Med3.fElements").Data());
+ tMain->SetAlias((friendName+"."+bname+"_Med5Ratio").Data(), (friendName+"."+bname+".fElements/"+friendName+"."+bname+"Med5.fElements").Data());
+ tMain->SetAlias((friendName+"."+bname+"_Par6GRatio").Data(), (friendName+"."+bname+".fElements/"+friendName+"."+bname+"Par6G.fElements").Data());
+ tMain->SetAlias((friendName+"."+bname+"_Med3Delta").Data(), (friendName+"."+bname+".fElements-"+friendName+"."+bname+"Med3.fElements").Data());
+ tMain->SetAlias((friendName+"."+bname+"_Med5Delta").Data(), (friendName+"."+bname+".fElements-"+friendName+"."+bname+"Med5.fElements").Data());
+ tMain->SetAlias((friendName+"."+bname+"_Par6GDelta").Data(), (friendName+"."+bname+".fElements-"+friendName+"."+bname+"Par6G.fElements").Data());
+ // }
+ }
+ }
+ }
+ //
+ //
+ //
+ if (checkAliases){
+ // to be implemented
+ }
+ return tMain;
+}
+
+
+