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";
43 if ( getLib.IsNull() )
gSystem->Load(libName.Data());
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");
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");
110 if ( mask == 0 )
return;
114 if ( mask & trigQA ) {
115 gROOT->LoadMacro(
"$ALICE_PHYSICS/PWGPP/macros/AddTaskMTRchamberEfficiency.C");
117 TString physSelName =
"PhysSelPass";
118 if ( ! usePhysicsSelection ) physSelName +=
",PhysSelReject";
119 trigChEffTask->SetTerminateOptions(physSelName,
"ANY",
"-5_105",Form(
"FORCEBATCH NoSelMatchApt FromTrg %s?%s?ANY?-5_105?NoSelMatchAptFromTrg",trigOutName.Data(),physSelName.Data()));
121 if ( mask & trackQA ) {
122 gROOT->LoadMacro(
"$ALICE_PHYSICS/PWGPP/PilotTrain/AddTaskMuonQA.C");
144 if ( ! mgr->InitAnalysis()) {
145 printf(
"Fatal: Cannot initialize analysis\n");
149 mgr->StartAnalysis(
"grid terminate");
151 if ( !
gSystem->AccessPathName(
"outputs_valid") )
gSystem->Exec(
"rm outputs_valid");
158 if ( filename.BeginsWith(
"alien://") )
return filename;
165 TString fullPath = fullDir.Data();
166 if ( ! fullDir.EndsWith(
"/") ) fullPath.Append(
"/");
167 fullPath += baseName;
175 Int_t idx = baseName.Index(
"#");
176 if ( idx > 0 ) baseName.Remove(0,idx+1);
184 TDirectory *savdir = gDirectory;
185 TDirectory *adir = savdir->mkdir(source->GetName());
189 TIter nextkey(source->GetListOfKeys());
190 while ((key = (TKey*)nextkey())) {
191 const char *classname = key->GetClassName();
192 TClass *cl = gROOT->GetClass(classname);
194 if (cl->InheritsFrom(TDirectory::Class())) {
195 source->cd(key->GetName());
196 TDirectory *subdir = gDirectory;
200 }
else if (cl->InheritsFrom(TTree::Class())) {
203 TTree *newT = T->CloneTree(-1,
"fast");
209 obj->Write(obj->GetName(),TObject::kSingleKey);
213 adir->SaveSelf(kTRUE);
219 UInt_t GetQAInfo (
const char* qaFileName,
TString dirNames =
"MUON_QA MTR_ChamberEffMap MUON.TrigEfficiencyMap MUON.TriggerEfficiencyMap" )
228 if ( inFullPath == outFullPath ) {
229 printf(
"Warning: input and output are same file!\n");
233 if ( inFullPath.BeginsWith(
"alien") && ! gGrid ) TGrid::Connect(
"alien://");
235 TObjArray* dirList = dirNames.Tokenize(
" ");
236 TFile* inFile = TFile::Open(qaFileName);
240 printf(
"Warning: file %s cannot be opened\n",qaFileName);
243 TFile* outFile = TFile::Open(outFilename,
"RECREATE");
245 TObjString* objStr = 0x0;
246 while ( (objStr=static_cast<TObjString*>(next())) ) {
248 TString currDir = objStr->String();
249 TObject* obj = inFile->Get(currDir.Data());
250 if ( ! obj )
continue;
251 if ( currDir ==
"MUON_QA" ) info |=
trackQA;
254 CopyDir(static_cast<TDirectory*>(obj));
269 THashList triggerList;
270 triggerList.SetOwner();
271 Bool_t hasOverlap = kFALSE;
272 for (
Int_t iarr=0; iarr<arr->GetEntries(); iarr++ ) {
273 TFile*
file = TFile::Open(arr->At(iarr)->GetName());
274 AliCounterCollection* eventCounters = (AliCounterCollection*)file->FindObjectAny(
"eventCounters");
275 if ( eventCounters ) {
276 TString listFromContainer = eventCounters->GetKeyWords(
"trigger");
277 TObjArray* trigArr = listFromContainer.Tokenize(
",");
278 for (
Int_t itrig=0; itrig<trigArr->GetEntries(); itrig++ ) {
279 TString currTrig = trigArr->At(itrig)->GetName();
280 if ( triggerList.FindObject(currTrig.Data()) ) {
281 if ( currTrig !=
"ANY" ) {
282 printf(
"Warning: duplicated trigger %s\n", currTrig.Data());
286 else triggerList.Add(
new TObjString(currTrig));
303 fm.OutputFile(outFilename.Data());
304 for (
Int_t iarr=0; iarr<arr->GetEntries(); iarr++ ) {
305 fm.AddFile(arr->At(iarr)->GetName());
314 if ( varType ==
'D' ) varType =
'F';
315 TString parName = Form(
"%s/%c",varName,varType);
316 if ( varType ==
'F' ) {
319 else if ( varType ==
'I' ) {
323 printf(
"Error: variable type %c not accepted", varType);
333 Int_t nVars = parList.GetEntries();
335 TArrayF varFloat(nVars);
336 for (
Int_t ivar=0; ivar<nVars; ivar++ ) {
337 TObject* obj = parList.At(ivar);
338 TString varName = obj->GetName();
340 branchName.Remove(varName.Length()-2);
341 if ( varName.EndsWith(
"F") ) {
343 tree->Branch(branchName.Data(),&varFloat[ivar],varName.Data());
345 else if ( varName.EndsWith(
"I") ) {
347 tree->Branch(branchName.Data(),&varInt[ivar],varName.Data());
357 TString trigOutName =
"trigChEff_ANY_Apt_allTrig.root";
358 if (
gSystem->AccessPathName(trigOutName.Data()) ) trigOutName =
filename;
359 TFile*
file = TFile::Open(filename.Data());
360 TList* inList = (
TList*)file->FindObjectAny(
"triggerChamberEff");
361 TString hChNames[] = {
"bendPlaneCountChamber",
"nonBendPlaneCountChamber",
"allTracksCountChamber"};
362 Int_t nHistos =
sizeof(hChNames)/
sizeof(hChNames[0]);
363 for (
Int_t ihisto=0; ihisto<nHistos; ihisto++ ) {
364 TH1* histo = (
TH1*)inList->FindObject(hChNames[ihisto].Data());
365 for (
Int_t ibin=1; ibin<=4; ibin++ ) {
366 Double_t currVal = ( histo ) ? histo->GetBinContent(ibin) : 0.;
377 if ( info == 0 )
return;
381 UInt_t forceTerminate = 0;
382 if ( inFilename.Contains(
"barrel") ) {
383 TString baseFilename =
"QAresults.root";
384 TString outerInFilename(qaFile);
385 outerInFilename.ReplaceAll(
"barrel",
"outer");
390 fileList +=
" " + inFilename;
393 printf(
"Merged files: %s => %s\n",fileList.Data(),baseFilename.Data());
395 gSystem->Exec(Form(
"rm %s",fileList.Data()));
396 forceTerminate = info;
399 else gSystem->Exec(Form(
"mv %s %s",inFilename.Data(),baseFilename.Data()));
401 inFilename = baseFilename;
404 UInt_t checkedMask = mask&info;
406 terminateQA(inFilename,
isMC,usePhysicsSelection,checkedMask,forceTerminate);
415 TFile* outFile = TFile::Open(
"trending.root",
"RECREATE");
416 TTree* tree =
new TTree(
"trending",
"trending");
UInt_t GetQAInfo(const char *qaFileName, TString dirNames="MUON_QA MTR_ChamberEffMap MUON.TrigEfficiencyMap MUON.TriggerEfficiencyMap")
Bool_t GetMergedQAInfo(TString fileList, TString outFilename="QAresults.root")
Quality assurance of MUON ESDs.
void MakeTrend(const char *qaFile, Int_t runNumber, Bool_t isMC=kFALSE, Bool_t usePhysicsSelection=kTRUE, UInt_t mask=(trackQA|trigQA))
UShort_t T(UShort_t m, UShort_t t)
void terminateQA(TString outfilename="QAresults.root", Bool_t isMC=kFALSE, Bool_t usePhysicsSelection=kTRUE, UInt_t mask=(trackQA|trigQA), UInt_t force=(trackQA|trigQA))
void AddTrigVars(TString filename, TList &parList)
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)
TString GetFullPath(TString filename)
Bool_t CheckMergedOverlap(TString fileList)
TString GetBaseName(TString filename)
Bool_t AddTreeVariable(TList &parList, const char *varName, char varType, Float_t val)
void FillTree(TTree *tree, TList &parList)
void CopyDir(TDirectory *source)