1 #if !defined(__CINT__) || defined(__MAKECINT__)
7 #include "TObjString.h"
12 #include "TParameter.h"
13 #include "TFileMerger.h"
14 #include "THashList.h"
17 #include "AliAnalysisManager.h"
18 #include "AliAnalysisAlien.h"
19 #include "AliESDInputHandler.h"
20 #include "AliCounterCollection.h"
41 TString libName =
"libPWGPPMUONlite";
42 TString getLib =
gSystem->GetLibraries(libName.Data(),
"",kFALSE);
43 if ( getLib.IsNull() )
gSystem->Load(libName.Data());
50 AliAnalysisAlien *plugin =
new AliAnalysisAlien();
53 plugin->SetRunMode(
"terminate");
56 plugin->SetAdditionalLibs(
"libCORRFW.so libPWGHFbase.so libPWGmuon.so libPWGPPMUONlite.so");
58 plugin->SetAdditionalRootLibs(
"libXMLParser.so libGui.so libProofPlayer.so");
60 plugin->AddIncludePath(
"-I.");
61 plugin->AddIncludePath(
"-I$ALICE_PHYSICS/PWGPP/MUON/lite");
84 AliAnalysisManager* mgr =
new AliAnalysisManager(
"testAnalysis");
85 mgr->SetCommonFileName(outfilename.Data());
86 mgr->SetGridHandler(alienHandler);
89 AliESDInputHandler* esdH =
new AliESDInputHandler();
90 esdH->SetReadFriends(kFALSE);
91 mgr->SetInputEventHandler(esdH);
93 TString trigOutName =
"trigChEff_ANY_Apt_allTrig.root";
94 if ( ( force &
trigQA ) == 0 ) {
95 if (
gSystem->AccessPathName(trigOutName) == 0 ) {
96 printf(
"Terminate already done for trigger. Skip\n");
100 if ( ( force &
trackQA ) == 0 ) {
101 TFile*
file = TFile::Open(outfilename.Data());
102 TKey* key = file->FindKeyAny(
"general2");
104 printf(
"Terminate already done for tracker. Skip\n");
112 if ( mask & trigQA ) {
113 gROOT->LoadMacro(
"$ALICE_PHYSICS/PWGPP/macros/AddTaskMTRchamberEfficiency.C");
115 TString physSelName =
"PhysSelPass";
116 if ( ! usePhysicsSelection ) physSelName +=
",PhysSelReject";
117 trigChEffTask->SetTerminateOptions(physSelName,
"ANY",
"-5_105",Form(
"FORCEBATCH NoSelMatchApt FromTrg %s?%s?ANY?-5_105?NoSelMatchAptFromTrg",trigOutName.Data(),physSelName.Data()));
119 if ( mask & trackQA ) {
120 gROOT->LoadMacro(
"$ALICE_PHYSICS/PWGPP/PilotTrain/AddTaskMuonQA.C");
142 if ( ! mgr->InitAnalysis()) {
143 printf(
"Fatal: Cannot initialize analysis\n");
147 mgr->StartAnalysis(
"grid terminate");
154 if ( filename.BeginsWith(
"alien://") )
return filename;
155 TString dirName =
gSystem->DirName(filename);
156 TString baseName =
gSystem->BaseName(filename);
157 TString currDir =
gSystem->pwd();
159 TString fullDir =
gSystem->pwd();
161 TString fullPath = fullDir.Data();
162 if ( ! fullDir.EndsWith(
"/") ) fullPath.Append(
"/");
163 fullPath += baseName;
170 TString baseName =
gSystem->BaseName(filename);
171 Int_t idx = baseName.Index(
"#");
172 if ( idx > 0 ) baseName.Remove(0,idx+1);
180 TDirectory *savdir = gDirectory;
181 TDirectory *adir = savdir->mkdir(source->GetName());
185 TIter nextkey(source->GetListOfKeys());
186 while ((key = (TKey*)nextkey())) {
187 const char *classname = key->GetClassName();
188 TClass *cl = gROOT->GetClass(classname);
190 if (cl->InheritsFrom(TDirectory::Class())) {
191 source->cd(key->GetName());
192 TDirectory *subdir = gDirectory;
196 }
else if (cl->InheritsFrom(TTree::Class())) {
197 TTree *T = (TTree*)source->Get(key->GetName());
199 TTree *newT = T->CloneTree(-1,
"fast");
203 TObject *obj = key->ReadObj();
205 obj->Write(obj->GetName(),TObject::kSingleKey);
209 adir->SaveSelf(kTRUE);
215 Bool_t
GetQAInfo (
const char* qaFileName, TString dirNames =
"MUON_QA MTR_ChamberEffMap MUON.TrigEfficiencyMap MUON.TriggerEfficiencyMap" )
222 if ( inFullPath == outFullPath ) {
223 printf(
"Warning: input and output are same file!\n");
227 if ( inFullPath.BeginsWith(
"alien") && ! gGrid ) TGrid::Connect(
"alien://");
229 TObjArray* dirList = dirNames.Tokenize(
" ");
230 TFile* outFile = TFile::Open(outFilename,
"RECREATE");
231 TFile* inFile = TFile::Open(qaFileName);
232 for ( Int_t idir=0; idir<dirList->GetEntries(); idir++ ) {
234 TObject* obj = inFile->Get(dirList->At(idir)->GetName());
235 if ( ! obj )
continue;
237 CopyDir(static_cast<TDirectory*>(obj));
251 TObjArray* arr = fileList.Tokenize(
" ");
252 THashList triggerList;
253 triggerList.SetOwner();
254 Bool_t hasOverlap = kFALSE;
255 for ( Int_t iarr=0; iarr<arr->GetEntries(); iarr++ ) {
256 TFile*
file = TFile::Open(arr->At(iarr)->GetName());
257 AliCounterCollection* eventCounters = (AliCounterCollection*)file->FindObjectAny(
"eventCounters");
258 if ( eventCounters ) {
259 TString listFromContainer = eventCounters->GetKeyWords(
"trigger");
260 TObjArray* trigArr = listFromContainer.Tokenize(
",");
261 for ( Int_t itrig=0; itrig<trigArr->GetEntries(); itrig++ ) {
262 TString currTrig = trigArr->At(itrig)->GetName();
263 if ( triggerList.FindObject(currTrig.Data()) ) {
264 if ( currTrig !=
"ANY" ) {
265 printf(
"Warning: duplicated trigger %s\n", currTrig.Data());
269 else triggerList.Add(
new TObjString(currTrig));
284 TObjArray* arr = fileList.Tokenize(
" ");
286 fm.OutputFile(outFilename.Data());
287 for ( Int_t iarr=0; iarr<arr->GetEntries(); iarr++ ) {
288 fm.AddFile(arr->At(iarr)->GetName());
295 Bool_t
AddTreeVariable ( TList& parList,
const char* varName,
char varType, Float_t val )
297 if ( varType ==
'D' ) varType =
'F';
298 TString parName = Form(
"%s/%c",varName,varType);
299 if ( varType ==
'F' ) {
300 parList.Add(
new TParameter<float>(parName,val));
302 else if ( varType ==
'I' ) {
303 parList.Add(
new TParameter<int>(parName,(Int_t)val));
306 printf(
"Error: variable type %c not accepted", varType);
316 Int_t nVars = parList.GetEntries();
317 TArrayI varInt(nVars);
318 TArrayF varFloat(nVars);
319 for ( Int_t ivar=0; ivar<nVars; ivar++ ) {
320 TObject* obj = parList.At(ivar);
321 TString varName = obj->GetName();
322 TString branchName = varName;
323 branchName.Remove(varName.Length()-2);
324 if ( varName.EndsWith(
"F") ) {
325 varFloat[ivar] = ((TParameter<float>*)obj)->GetVal();
326 tree->Branch(branchName.Data(),&varFloat[ivar],varName.Data());
328 else if ( varName.EndsWith(
"I") ) {
329 varInt[ivar] = (Int_t)((TParameter<int>*)obj)->GetVal();
330 tree->Branch(branchName.Data(),&varInt[ivar],varName.Data());
340 TString trigOutName =
"trigChEff_ANY_Apt_allTrig.root";
341 if (
gSystem->AccessPathName(trigOutName.Data()) ) trigOutName = filename;
342 TFile*
file = TFile::Open(filename.Data());
343 TList* inList = (TList*)file->FindObjectAny(
"triggerChamberEff");
344 TString hChNames[] = {
"bendPlaneCountChamber",
"nonBendPlaneCountChamber",
"allTracksCountChamber"};
345 Int_t nHistos =
sizeof(hChNames)/
sizeof(hChNames[0]);
346 for ( Int_t ihisto=0; ihisto<nHistos; ihisto++ ) {
347 TH1* histo = (TH1*)inList->FindObject(hChNames[ihisto].Data());
348 for ( Int_t ibin=1; ibin<=4; ibin++ ) {
349 Double_t currVal = ( histo ) ? histo->GetBinContent(ibin) : 0.;
357 void MakeTrend (
const char* qaFile, Int_t runNumber, Bool_t
isMC = kFALSE, Bool_t usePhysicsSelection = kTRUE, UInt_t mask = (
trackQA|
trigQA) )
360 if ( ! isOk )
return;
364 UInt_t forceTerminate = 0;
365 if ( inFilename.Contains(
"barrel") ) {
366 TString outerInFilename(qaFile);
367 outerInFilename.ReplaceAll(
"barrel",
"outer");
372 fileList +=
" " + inFilename;
375 inFilename =
"QAresults.root";
376 printf(
"Merged files: %s => %s\n",fileList.Data(),inFilename.Data());
378 gSystem->Exec(Form(
"rm %s",fileList.Data()));
393 TFile* outFile = TFile::Open(
"trending.root",
"RECREATE");
394 TTree* tree =
new TTree(
"trending",
"trending");
TString GetFullPath(TString filename)
void AddTrigVars(TString filename, TList &parList)
void CopyDir(TDirectory *source)
void terminateQA(TString outfilename="QAresults.root", Bool_t isMC=kFALSE, Bool_t usePhysicsSelection=kTRUE, UInt_t mask=(trackQA|trigQA), UInt_t force=(trackQA|trigQA))
Quality assurance of MUON ESDs.
void FillTree(TTree *tree, TList &parList)
TString GetBaseName(TString filename)
AliAnalysisAlien * CreateAlienHandler()
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
Bool_t CheckMergedOverlap(TString fileList)
Bool_t AddTreeVariable(TList &parList, const char *varName, char varType, Float_t val)
Bool_t GetMergedQAInfo(TString fileList, TString outFilename="QAresults.root")
void MakeTrend(const char *qaFile, Int_t runNumber, Bool_t isMC=kFALSE, Bool_t usePhysicsSelection=kTRUE, UInt_t mask=(trackQA|trigQA))
Bool_t GetQAInfo(const char *qaFileName, TString dirNames="MUON_QA MTR_ChamberEffMap MUON.TrigEfficiencyMap MUON.TriggerEfficiencyMap")