]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/FLOW/macros/runFlowAnalysis.C
MC task also now uses exchange container and gets MC reaction plane from FlowEventSimple
[u/mrichter/AliRoot.git] / PWG2 / FLOW / macros / runFlowAnalysis.C
CommitLineData
334e3256 1#include "TStopwatch.h"
2#include "TObjArray"
3#include "Riostream.h"
26c4cbb9 4#include "TFile.h"
334e3256 5
03a02aca 6//--------------------------------------------------------------------------------------
7// RUN SETTINGS
334e3256 8//flow analysis method can be: (set to kTRUE or kFALSE)
29b61d43 9Bool_t SP = kTRUE;
10Bool_t LYZ1 = kTRUE;
334e3256 11Bool_t LYZ2 = kFALSE;
12Bool_t LYZEP = kFALSE;
13Bool_t GFC = kTRUE;
14Bool_t QC = kTRUE;
ce78b98c 15Bool_t FQD = kTRUE;
334e3256 16Bool_t MCEP = kFALSE; //does not work yet 24/12/08
03a02aca 17//--------------------------------------------------------------------------------------
334e3256 18
20e52807 19// Weights
20// Use weights for Q vector
21Bool_t usePhiWeights = kFALSE; //Phi (correction for non-uniform azimuthal acceptance)
22Bool_t usePtWeights = kFALSE; //v'(pt) (differential flow in pt)
23Bool_t useEtaWeights = kFALSE; //v'(eta) (differential flow in eta)
24
03a02aca 25//--------------------------------------------------------------------------------------
26// CUT SETTINGS
334e3256 27//integrated selection
28Double_t ptMaxInt = 10.;
29Double_t ptMinInt = 0.;
30Double_t etaMaxInt = 1.;
31Double_t etaMinInt = -1.;
32Double_t phiMaxInt = 7.5;
33Double_t phiMinInt = 0.;
34Int_t PIDInt = 211;
35
36//differential selection
37Double_t ptMaxDiff = 10.;
38Double_t ptMinDiff = 0.;
39Double_t etaMaxDiff = 1.;
40Double_t etaMinDiff = -1.;
41Double_t phiMaxDiff = 7.5;
42Double_t phiMinDiff = 0.;
43Int_t PIDDiff = 211;
03a02aca 44//--------------------------------------------------------------------------------------
26c4cbb9 45
fdd8c18f 46enum anaModes {mLocal,mLocalSource,mLocalPAR,};
47//mLocal: Analyze data on your computer using aliroot
48//mLocalPAR: Analyze data on your computer using root + PAR files
49//mLocalSource: Analyze data on your computer using root + source files
50
51
334e3256 52
26c4cbb9 53Int_t offset = 0;
54
d7671632 55int runFlowAnalysis(Int_t mode=mLocal, Int_t aRuns = 1000, const char*
ce78b98c 56 // dir="/data/alice1/kolk/KineOnly3/")
57 dir="/Users/snelling/alice_data/KineOnly3/")
334e3256 58{
59 TStopwatch timer;
60 timer.Start();
61
62 if (LYZ1 && LYZ2) {cout<<"WARNING: you cannot run LYZ1 and LYZ2 at the same time! LYZ2 needs the output from LYZ1."<<endl; exit(); }
334e3256 63 if (LYZ2 && LYZEP) {cout<<"WARNING: you cannot run LYZ2 and LYZEP at the same time! LYZEP needs the output from LYZ2."<<endl; exit(); }
334e3256 64 if (LYZ1 && LYZEP) {cout<<"WARNING: you cannot run LYZ1 and LYZEP at the same time! LYZEP needs the output from LYZ2."<<endl; exit(); }
65
66
67 cout<<endl;
68 cout<<" ---- BEGIN ANALYSIS ---- "<<endl;
69 cout<<endl;
70
fdd8c18f 71 LoadLibraries(mode);
2a413443 72
fdd8c18f 73 if (mode == mLocal || mode == mLocalPAR) {
74 // AliFlow event in aliroot or with pars
75 AliFlowEventSimpleMaker* fEventMaker = new AliFlowEventSimpleMaker();
76 }
77 else if (mode == mLocalSource) {
78 // flow event in source mode
79 FlowEventSimpleMaker* fEventMaker = new FlowEventSimpleMaker();
80 }
81 else{
82 cout << "No supported running mode selected!" << endl;
83 break;
84 }
2a413443 85
2a413443 86
334e3256 87 //------------------------------------------------------------------------
e085f1a9 88 //cuts:
334e3256 89 AliFlowTrackSimpleCuts* cutsInt = new AliFlowTrackSimpleCuts();
90 cutsInt->SetPtMax(ptMaxInt);
91 cutsInt->SetPtMin(ptMinInt);
92 cutsInt->SetEtaMax(etaMaxInt);
93 cutsInt->SetEtaMin(etaMinInt);
94 cutsInt->SetPhiMax(phiMaxInt);
95 cutsInt->SetPhiMin(phiMinInt);
96 cutsInt->SetPID(PIDInt);
97
98 AliFlowTrackSimpleCuts* cutsDiff = new AliFlowTrackSimpleCuts();
99 cutsDiff->SetPtMax(ptMaxDiff);
100 cutsDiff->SetPtMin(ptMinDiff);
101 cutsDiff->SetEtaMax(etaMaxDiff);
102 cutsDiff->SetEtaMin(etaMinDiff);
103 cutsDiff->SetPhiMax(phiMaxDiff);
104 cutsDiff->SetPhiMin(phiMinDiff);
105 cutsDiff->SetPID(PIDDiff);
106
03a02aca 107 //if the weights are used:
108 TFile *fileWithWeights = NULL;
109 TList *listWithWeights = NULL;
334e3256 110
14db9c04 111 if(usePhiWeights||usePtWeights||useEtaWeights) {
112 fileWithWeights = TFile::Open("weights.root","READ");
113 if(fileWithWeights) {
114 listWithWeights = (TList*)fileWithWeights->Get("weights");
115 }
116 else
117 {cout << " WARNING: the file <weights.root> with weights from the previous run was not found."<<endl;
118 break;
119 }
e085f1a9 120 }
121
122 //flow methods:
334e3256 123 AliFlowAnalysisWithQCumulants *qc = NULL;
124 AliFlowAnalysisWithCumulants *gfc = NULL;
125 AliFittingQDistribution *fqd = NULL;
126 AliFlowAnalysisWithLeeYangZeros *lyz1 = NULL;
127 AliFlowAnalysisWithLeeYangZeros *lyz2 = NULL;
128 AliFlowAnalysisWithLYZEventPlane *lyzep = NULL;
129 AliFlowAnalysisWithScalarProduct *sp = NULL;
e085f1a9 130 AliFlowAnalysisWithMCEventPlane *mcep = NULL;
deebd72f 131
334e3256 132 //MCEP = monte carlo event plane
deebd72f 133 if (MCEP) {
134 AliFlowAnalysisWithMCEventPlane *mcep = new AliFlowAnalysisWithMCEventPlane();
135 mcep->Init();
136 }
334e3256 137
138 //QC = Q-cumulants
deebd72f 139 if(QC) {
140 AliFlowAnalysisWithQCumulants* qc = new AliFlowAnalysisWithQCumulants();
e085f1a9 141 qc->Init();
03a02aca 142 if(listWithWeights) qc->SetWeightsList(listWithWeights);
143 if(usePhiWeights) qc->SetUsePhiWeights(usePhiWeights);
144 if(usePtWeights) qc->SetUsePtWeights(usePtWeights);
145 if(useEtaWeights) qc->SetUseEtaWeights(useEtaWeights);
deebd72f 146 }
334e3256 147
148 //GFC = Generating Function Cumulants
deebd72f 149 if(GFC) {
150 AliFlowAnalysisWithCumulants* gfc = new AliFlowAnalysisWithCumulants();
e5e75b58 151 gfc->Init();
152 if(listWithWeights) gfc->SetWeightsList(listWithWeights);
153 if(usePhiWeights) gfc->SetUsePhiWeights(usePhiWeights);
154 if(usePtWeights) gfc->SetUsePtWeights(usePtWeights);
155 if(useEtaWeights) gfc->SetUseEtaWeights(useEtaWeights);
deebd72f 156 }
334e3256 157
158 //FQD = Fitting q-distribution
deebd72f 159 if(FQD) {
160 AliFittingQDistribution* fqd = new AliFittingQDistribution();
14db9c04 161 fqd->Init();
162 if(listWithWeights) fqd->SetWeightsList(listWithWeights);
163 if(usePhiWeights) fqd->SetUsePhiWeights(usePhiWeights);
deebd72f 164 }
60ec66fb 165
166 //SP = Scalar Product
167 if(SP) {
168 AliFlowAnalysisWithScalarProduct* sp = new AliFlowAnalysisWithScalarProduct();
169 sp->Init();
170 }
171
334e3256 172 //LYZ1 = Lee-Yang Zeroes first run
deebd72f 173 if(LYZ1) {
174 AliFlowAnalysisWithLeeYangZeros* lyz1 = new AliFlowAnalysisWithLeeYangZeros();
175 lyz1->SetFirstRun(kTRUE);
176 lyz1->SetUseSum(kTRUE);
177 lyz1->Init();
178 }
334e3256 179
180 //LYZ2 = Lee-Yang Zeroes second run
deebd72f 181 if(LYZ2) {
182 AliFlowAnalysisWithLeeYangZeros* lyz2 = new AliFlowAnalysisWithLeeYangZeros();
183 // read the input file from the first run
184 TString inputFileNameLYZ2 = "outputLYZ1analysis.root" ;
185 TFile* inputFileLYZ2 = new TFile(inputFileNameLYZ2.Data(),"READ");
186 if(!inputFileLYZ2 || inputFileLYZ2->IsZombie()) {
ce78b98c 187 cerr << " ERROR: NO First Run file... " << endl ;
188 break;
deebd72f 189 }
190 else {
191 TList* inputListLYZ2 = (TList*)inputFileLYZ2->Get("cobjLYZ1");
ace38bad 192 if (!inputListLYZ2) {cout<<"Input list is NULL pointer!"<<endl; break;}
deebd72f 193 else {
194 cout<<"LYZ2 input file/list read..."<<endl;
195 lyz2->SetFirstRunList(inputListLYZ2);
196 lyz2->SetFirstRun(kFALSE);
197 lyz2->SetUseSum(kTRUE);
198 lyz2->Init();
334e3256 199 }
200 }
deebd72f 201 }
202
334e3256 203 //LYZEP = Lee-Yang Zeroes event plane
deebd72f 204 if(LYZEP) {
205 AliFlowLYZEventPlane* ep = new AliFlowLYZEventPlane() ;
206 AliFlowAnalysisWithLYZEventPlane* lyzep = new AliFlowAnalysisWithLYZEventPlane();
207 // read the input file from the second lyz run
208 TString inputFileNameLYZEP = "outputLYZ2analysis.root" ;
209 TFile* inputFileLYZEP = new TFile(inputFileNameLYZEP.Data(),"READ");
210 if(!inputFileLYZEP || inputFileLYZEP->IsZombie()) {
ce78b98c 211 cerr << " ERROR: NO Second Run file... " << endl ;
212 break;
213 }
deebd72f 214 else {
215 TList* inputListLYZEP = (TList*)inputFileLYZEP->Get("cobjLYZ2");
ace38bad 216 if (!inputListLYZEP) {cout<<"Input list is NULL pointer!"<<endl; break;}
deebd72f 217 else {
218 cout<<"LYZEP input file/list read..."<<endl;
219 ep ->SetSecondRunList(inputListLYZEP);
220 lyzep->SetSecondRunList(inputListLYZEP);
221 ep ->Init();
222 lyzep->Init();
334e3256 223 }
224 }
deebd72f 225 }
334e3256 226 //------------------------------------------------------------------------
227
26c4cbb9 228
334e3256 229 //standard code
230 Int_t fCount = 0;
231 TString execDir(gSystem->pwd());
232 TString targetDir(dir);
233 TSystemDirectory* baseDir = new TSystemDirectory(".", dir);
234 TList* dirList = baseDir->GetListOfFiles();
235 if (!dirList) {
236 cout << endl << "No input files in: " << targetDir.Data() << endl;
237 break;
238 }
239 Int_t nDirs = dirList->GetEntries();
240 cout<<endl;
241 cout<<"Int_t nDirs = "<<nDirs<<endl;
242 gSystem->cd(execDir);
243
244 for(Int_t iDir=0;iDir<nDirs;++iDir)
245 {
246 TSystemFile* presentDir = (TSystemFile*)dirList->At(iDir);
247 if(!presentDir || !presentDir->IsDirectory() ||
248 strcmp(presentDir->GetName(), ".") == 0 ||
249 strcmp(presentDir->GetName(), "..") == 0)
250 {
251 cout << endl;
252 cout << "Directory (" << iDir << "): " << presentDir->GetName() <<
253 " - Skipping ... " << endl;
254 continue ;
255 }
256
257 if(offset > 0) { --offset ; continue ; }
258 if((aRuns > 0) && (fCount >= aRuns)) { break ; }
259
260 TString presentDirName(dir); // aDataDir
261 presentDirName += presentDir->GetName();
262 presentDirName += "/";
263 //cerr<<" presentDirName = "<<presentDirName<<endl;
264
265 TString fileName = presentDirName;
266 fileName += "galice.root";
267 Long_t *id, *size, *flags, *modtime;
268 if(gSystem->GetPathInfo(fileName.Data(),id,size,flags,modtime))
269 {
270 cout << " File : " << fileName << " does NOT exist ! - Skipping ... "
271 << endl;
272 continue;
273 }
deebd72f 274 // cout << endl ; cout << "Directory (" << iDir << "): " << presentDirName << " ... " << endl;
334e3256 275
276 //loop (simulations in the present dir)
277 TSystemDirectory* evtsDir = new TSystemDirectory(".",
278 presentDirName.Data());
279 TList* fileList = evtsDir->GetListOfFiles();
280 Int_t nFiles = fileList->GetEntries();
deebd72f 281 //cout<<" Int_t nFiles = "<<nFiles<<endl;
334e3256 282 gSystem->cd(execDir);
283 for(Int_t iFiles=0; iFiles<nFiles; ++iFiles)
284 {
285 TSystemFile* presentFile = (TSystemFile*) fileList->At(iFiles);
286 TString presentFileName(presentDirName);
287 presentFileName += presentFile->GetName();
288
289 if(!(presentFileName.Contains("Kinematics") &&
290 presentFileName.Contains("root"))) { continue ; }
291
deebd72f 292 //cout << " found: " << presentFileName.Data() << endl;
334e3256 293
294 TFile* kineFile = new TFile(presentFileName.Data(), "READ");
295 // kineFile->ls();
296 Int_t nEvts = kineFile->GetNkeys() ;
deebd72f 297 //cout << " . found: " << nEvts << " KineTree(s) in " << presentFileName.Data() << endl;
334e3256 298 TList* kineEventsList = (TList*)kineFile->GetListOfKeys();
299 TTree* kTree;
300 TIter next(kineEventsList);
301 TKey* key;
302
303 //loop over the events
304 while( key=(TKey *)next() )
305 {
306 TDirectory* tDir = (TDirectory*)key->ReadObj();
307 if(!tDir) break;
308
309 TString evtDir(tDir->GetName());
deebd72f 310 //cout << " . . found: " << tDir->GetName() << endl;
334e3256 311
312 kTree = (TTree *)tDir->Get("TreeK");
313 if(!kTree) break;
314
315 Int_t nPart = kTree->GetEntries();
deebd72f 316 //cout << " . . . kTree " << fCount << " has " << nPart << " particles " << endl;
334e3256 317
318 //-----------------------------------------------------------
26c4cbb9 319 //fill and save the flow event
320 AliFlowEventSimple *fEvent = fEventMaker->FillTracks(kTree, cutsInt, cutsDiff);
321
d7671632 322 if(MCEP) mcep->Make(fEvent);
deebd72f 323 if(QC) qc->Make(fEvent);
324 if(GFC) gfc->Make(fEvent);
325 if(FQD) fqd->Make(fEvent);
326 if(LYZ1) lyz1->Make(fEvent);
327 if(LYZ2) lyz2->Make(fEvent);
328 if(LYZEP) lyzep->Make(fEvent,ep);
329 if(SP) sp->Make(fEvent);
334e3256 330 //-----------------------------------------------------------
331
332 fCount++;
deebd72f 333 cout << "# " << fCount << " events processed" << endl;
334e3256 334 delete kTree;
335 delete fEvent;
336 }
337 delete kineFile ;
338 }
339 delete evtsDir ;
340 }
341
342 //--------------------------------------------------------------
343 //calculating and storing the final results of flow analysis
60ec66fb 344 if(MCEP) {mcep->Finish(); mcep->WriteHistograms("outputMCEPanalysis.root");}
ace38bad 345 if(SP) {sp->Finish(); sp->WriteHistograms("outputSPanalysis.root");}
deebd72f 346 if(QC) {qc->Finish(); qc->WriteHistograms("outputQCanalysis.root");}
347 if(GFC) {gfc->Finish(); gfc->WriteHistograms("outputGFCanalysis.root");}
348 if(FQD) {fqd->Finish(); fqd->WriteHistograms("outputFQDanalysis.root");}
349 if(LYZ1) {lyz1->Finish(); lyz1->WriteHistograms("outputLYZ1analysis.root");}
350 if(LYZ2) {lyz2->Finish(); lyz2->WriteHistograms("outputLYZ2analysis.root");}
351 if(LYZEP) {lyzep->Finish(); lyzep->WriteHistograms("outputLYZEPanalysis.root");}
ace38bad 352
334e3256 353 //--------------------------------------------------------------
354
355 cout << endl;
ace38bad 356 cout << " Fini ... " << endl;
334e3256 357 cout << endl;
358
359 timer.Stop();
360 cout << endl;
361 timer.Print();
362}
21e694dd 363
364void SetupPar(char* pararchivename)
365{
366 //Load par files, create analysis libraries
367 //For testing, if par file already decompressed and modified
368 //classes then do not decompress.
369
370 TString cdir(Form("%s", gSystem->WorkingDirectory() )) ;
371 TString parpar(Form("%s.par", pararchivename)) ;
372 if ( gSystem->AccessPathName(parpar.Data()) ) {
373 gSystem->ChangeDirectory(gSystem->Getenv("ALICE_ROOT")) ;
374 TString processline(Form(".! make %s", parpar.Data())) ;
375 gROOT->ProcessLine(processline.Data()) ;
376 gSystem->ChangeDirectory(cdir) ;
377 processline = Form(".! mv /tmp/%s .", parpar.Data()) ;
378 gROOT->ProcessLine(processline.Data()) ;
379 }
380 if ( gSystem->AccessPathName(pararchivename) ) {
381 TString processline = Form(".! tar xvzf %s",parpar.Data()) ;
382 gROOT->ProcessLine(processline.Data());
383 }
384
385 TString ocwd = gSystem->WorkingDirectory();
386 gSystem->ChangeDirectory(pararchivename);
387
388 // check for BUILD.sh and execute
389 if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {
390 printf("*******************************\n");
391 printf("*** Building PAR archive ***\n");
392 cout<<pararchivename<<endl;
393 printf("*******************************\n");
394
395 if (gSystem->Exec("PROOF-INF/BUILD.sh")) {
396 Error("runProcess","Cannot Build the PAR Archive! - Abort!");
397 return -1;
398 }
399 }
400 // check for SETUP.C and execute
401 if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {
402 printf("*******************************\n");
403 printf("*** Setup PAR archive ***\n");
404 cout<<pararchivename<<endl;
405 printf("*******************************\n");
406 gROOT->Macro("PROOF-INF/SETUP.C");
407 }
408
409 gSystem->ChangeDirectory(ocwd.Data());
410 printf("Current dir: %s\n", ocwd.Data());
411}
412
fdd8c18f 413void LoadLibraries(const anaModes mode) {
414
415 //--------------------------------------
416 // Load the needed libraries most of them already loaded by aliroot
417 //--------------------------------------
418 gSystem->Load("libTree.so");
419 gSystem->Load("libGeom.so");
420 gSystem->Load("libVMC.so");
421 gSystem->Load("libXMLIO.so");
422 gSystem->Load("libPhysics.so");
423
424 //----------------------------------------------------------
425 // >>>>>>>>>>> Local mode <<<<<<<<<<<<<<
426 //----------------------------------------------------------
427 if (mode==mLocal) {
428 //--------------------------------------------------------
429 // If you want to use already compiled libraries
430 // in the aliroot distribution
431 //--------------------------------------------------------
432 gSystem->Load("libSTEERBase");
433 gSystem->Load("libESD");
434 gSystem->Load("libAOD");
435 gSystem->Load("libANALYSIS");
436 gSystem->Load("libANALYSISalice");
437 gSystem->Load("libCORRFW.so");
438 cerr<<"libCORRFW.so loaded..."<<endl;
439 gSystem->Load("libPWG2flowCommon.so");
440 cerr<<"libPWG2flowCommon.so loaded..."<<endl;
441 gSystem->Load("libPWG2flowTasks.so");
442 cerr<<"libPWG2flowTasks.so loaded..."<<endl;
443 }
444
445 else if (mode == mLocalPAR) {
446 //--------------------------------------------------------
447 //If you want to use root and par files from aliroot
448 //--------------------------------------------------------
449 //If you want to use root and par files from aliroot
450 //--------------------------------------------------------
451 SetupPar("STEERBase");
452 SetupPar("ESD");
453 SetupPar("AOD");
454 SetupPar("ANALYSIS");
455 SetupPar("ANALYSISalice");
456 SetupPar("PWG2AOD");
457 SetupPar("CORRFW");
458 SetupPar("PWG2flowCommon");
459 cerr<<"PWG2flowCommon.par loaded..."<<endl;
460 SetupPar("PWG2flowTasks");
461 cerr<<"PWG2flowTasks.par loaded..."<<endl;
462 }
463
464 //---------------------------------------------------------
465 // <<<<<<<<<< Source mode >>>>>>>>>>>>
466 //---------------------------------------------------------
467 else if (mode==mLocalSource) {
468
469 // In root inline compile
470
471
472 // Constants
473 gROOT->LoadMacro("AliFlowCommon/AliFlowCommonConstants.cxx+");
474 gROOT->LoadMacro("AliFlowCommon/AliFlowLYZConstants.cxx+");
475 gROOT->LoadMacro("AliFlowCommon/AliFlowCumuConstants.cxx+");
476
477 // Flow event
478 gROOT->LoadMacro("AliFlowCommon/AliFlowVector.cxx+");
479 gROOT->LoadMacro("AliFlowCommon/AliFlowTrackSimple.cxx+");
480 gROOT->LoadMacro("AliFlowCommon/AliFlowEventSimple.cxx+");
481
482 // Cuts
483 gROOT->LoadMacro("AliFlowCommon/AliFlowTrackSimpleCuts.cxx+");
484
485 // Output histosgrams
486 gROOT->LoadMacro("AliFlowCommon/AliFlowCommonHist.cxx+");
487 gROOT->LoadMacro("AliFlowCommon/AliFlowCommonHistResults.cxx+");
488 gROOT->LoadMacro("AliFlowCommon/AliFlowLYZHist1.cxx+");
489 gROOT->LoadMacro("AliFlowCommon/AliFlowLYZHist2.cxx+");
490
491 // Functions needed for various methods
492 gROOT->LoadMacro("AliFlowCommon/AliCumulantsFunctions.cxx+");
493 gROOT->LoadMacro("AliFlowCommon/AliQCumulantsFunctions.cxx+");
494 gROOT->LoadMacro("AliFlowCommon/AliFittingFunctionsForQDistribution.cxx+");
495 gROOT->LoadMacro("AliFlowCommon/AliFlowLYZEventPlane.cxx+");
496
497 // Flow Analysis code for various methods
498 gROOT->LoadMacro("AliFlowCommon/AliFlowAnalysisWithMCEventPlane.cxx+");
499 gROOT->LoadMacro("AliFlowCommon/AliFlowAnalysisWithScalarProduct.cxx+");
500 gROOT->LoadMacro("AliFlowCommon/AliFlowAnalysisWithLYZEventPlane.cxx+");
501 gROOT->LoadMacro("AliFlowCommon/AliFlowAnalysisWithLeeYangZeros.cxx+");
502 gROOT->LoadMacro("AliFlowCommon/AliFlowAnalysisWithCumulants.cxx+");
503 gROOT->LoadMacro("AliFlowCommon/AliFlowAnalysisWithQCumulants.cxx+");
504 gROOT->LoadMacro("AliFlowCommon/AliFittingQDistribution.cxx+");
505
506 // Class to fill the FlowEvent without aliroot dependence
507 // can be found in the directory FlowEventMakers
508 gROOT->LoadMacro("FlowEventMakers/FlowEventSimpleMaker.cxx+");
509
510 cout << "finished loading macros!" << endl;
511
512 }
513
514}
515
516