2 //--------------------------------------------------
3 // Example macro to do analysis with the
4 // analysis classes in CaloTrackCorrelations
5 // Can be executed with Root and AliRoot
7 // Pay attention to the options and definitions
8 // set in the lines below
10 // Author : Gustavo Conesa Balbastre (INFN-LNF)
12 //-------------------------------------------------
13 enum anaModes {mLocal=0, mPROOF=1, mPlugin=2, mGRID=3};
14 //mLocal = 0: Analyze locally files in your computer
15 //mPROOF = 1: Analyze files on GRID with Plugin
16 //mPlugin = 2: Analyze files on GRID with Plugin
17 //mGRID = 3: Analyze files on GRID, jobs launched from aliensh
19 //---------------------------------------------------------------------------
20 // Settings to read locally several files, only for "mLocal" mode
21 // The different values are default, they can be set with environmental
22 // variables: INDIR, PATTERN, NFILES, respectivelly
24 char * kInDir = "/user/data/files/";
25 char * kPattern = ""; // Data are in files kInDir/kPattern+i
28 //---------------------------------------------------------------------------
29 // Dataset for proof analysis, mode=mPROOF
30 // char * kDataset = "/alice/vernet/PbPb_LHC10h_ESD";
32 char * kDatasetPROOF = "/alice/vernet/LHC11b_149646";
33 Int_t kDatasetNMaxFiles = 20;
34 TString ccin2p3UserName = "arbor" ;
35 TString alienUserName = "narbor" ;
37 //---------------------------------------------------------------------------
38 // Collection file for grid analysis
40 char * kXML = "collection.xml";
42 //---------------------------------------------------------------------------
43 //Scale histograms from file. Change to kTRUE when xsection file exists
44 //Put name of file containing xsection
45 //Put number of events per ESD file
46 //This is an specific case for normalization of Pythia files.
47 const char * kXSFileName = "pyxsec.root";
49 //---------------------------------------------------------------------------
51 //Set some default values, but used values are set in the code!
53 Bool_t kMC = kFALSE; //With real data kMC = kFALSE
54 TString kInputData = "ESD"; //ESD, AOD, MC, deltaAOD
56 TString kCollision = "pp";
57 Bool_t outAOD = kFALSE; //Some tasks doesnt need it.
63 //________________________
64 void ana(Int_t mode=mGRID)
68 //--------------------------------------------------------------------
69 // Load analysis libraries
70 // Look at the method below,
71 // change whatever you need for your analysis case
72 // ------------------------------------------------------------------
75 //gSystem->ListLibraries();
77 //-------------------------------------------------------------------------------------------------
78 //Create chain from ESD and from cross sections files, look below for options.
79 //-------------------------------------------------------------------------------------------------
81 // Set kInputData and kTreeName looking to the kINDIR
85 // Check global analysis settings
87 CheckEnvironmentVariables();
89 printf("*********************************************\n");
90 printf("*** Input data < %s >, pass %s, tree < %s >, MC? < %d > ***\n",kInputData.Data(),kPass.Data(),kTreeName.Data(),kMC);
91 printf("*********************************************\n");
93 TChain * chain = new TChain(kTreeName) ;
94 TChain * chainxs = new TChain("Xsection") ;
95 CreateChain(mode, chain, chainxs);
98 printf("===== kMC %d, chainxs %p\n",kMC,chainxs);
99 if(kMC && chainxs && chainxs->GetEntries() > 0)
101 Int_t nfiles = chainxs->GetEntries();
103 //Get the cross section
104 Double_t xsection = 0;
107 GetAverageXsection(chainxs, xsection, ntrials);
109 Int_t nEventsPerFile = chain->GetEntries() / nfiles;
111 Double_t trials = ntrials / nEventsPerFile ;
113 scale = xsection/trials;
115 printf("Get Cross section : nfiles %d, nevents %d, nevents per file %d \n",nfiles, chain->GetEntries(),nEventsPerFile);
116 printf(" ntrials %d, trials %2.2f, xs %2.2e, scale factor %2.2e\n", ntrials,trials,xsection,scale);
120 printf("*********************************************\n");
121 printf("number of entries # %lld, skipped %d\n", chain->GetEntries()) ;
122 printf("*********************************************\n");
126 printf("STOP, no chain available\n");
130 AliLog::SetGlobalLogLevel(AliLog::kError);//Minimum prints on screen
132 //------------------------------------------
133 // Alien handler part
134 //------------------------------------------
135 AliAnalysisGrid *alienHandler=0x0;
138 // Create and configure the alien handler plugin
139 gROOT->LoadMacro("CreateAlienHandler.C");
140 alienHandler = CreateAlienHandler();
141 if (!alienHandler) return;
144 //--------------------------------------
145 // Make the analysis manager
146 //-------------------------------------
147 AliAnalysisManager *mgr = new AliAnalysisManager("Manager", "Manager");
148 //AliAnalysisManager::SetUseProgressBar(kTRUE);
149 //mgr->SetSkipTerminate(kTRUE);
150 //mgr->SetNSysInfo(1);
154 // Connect plugin to the analysis manager
155 mgr->SetGridHandler(alienHandler);
159 if((kMC || kInputData == "MC") && !kInputData.Contains("AOD"))
161 AliMCEventHandler* mcHandler = new AliMCEventHandler();
162 mcHandler->SetReadTR(kFALSE);//Do not search TrackRef file
163 mgr->SetMCtruthEventHandler(mcHandler);
164 if( kInputData == "MC")
166 cout<<"MC INPUT EVENT HANDLER"<<endl;
167 mgr->SetInputEventHandler(NULL);
172 // AOD output handler
173 if(kInputData!="deltaAOD" && outAOD)
175 cout<<"Init output handler"<<endl;
176 AliAODHandler* aodoutHandler = new AliAODHandler();
177 aodoutHandler->SetOutputFileName("aod.root");
178 ////aodoutHandler->SetCreateNonStandardAOD();
179 mgr->SetOutputEventHandler(aodoutHandler);
184 if(kInputData == "ESD")
187 AliESDInputHandler *esdHandler = new AliESDInputHandler();
188 esdHandler->SetReadFriends(kFALSE);
189 mgr->SetInputEventHandler(esdHandler);
190 cout<<"ESD handler "<<mgr->GetInputEventHandler()<<endl;
192 else if(kInputData.Contains("AOD"))
195 AliAODInputHandler *aodHandler = new AliAODInputHandler();
196 mgr->SetInputEventHandler(aodHandler);
197 if(kInputData == "deltaAOD") aodHandler->AddFriend("deltaAODCaloTrackCorr.root");
198 cout<<"AOD handler "<<mgr->GetInputEventHandler()<<endl;
201 //mgr->RegisterExternalFile("deltaAODCaloTrackCorr.root");
202 //mgr->SetDebugLevel(1); // For debugging, do not uncomment if you want no messages.
204 TString outputFile = AliAnalysisManager::GetCommonFileName();
206 //-------------------------------------------------------------------------
207 // Define task, put here any other task that you want to use.
208 //-------------------------------------------------------------------------
211 if(kInputData=="ESD")
213 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
214 AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(kMC);
218 if(kCollision=="PbPb" && kInputData=="ESD")
220 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
221 AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
224 if(kCollision=="PbPb")
226 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskVZEROEPSelection.C");
227 AliVZEROEPSelectionTask * EPV0 = AddTaskVZEROEPSelection();
229 gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskEventplane.C");
230 AliEPSelectionTask * EP = AddTaskEventplane();
233 // Simple event counting tasks
235 gROOT->LoadMacro("$ALICE_ROOT/PWGGA/CaloTrackCorrelations/macros/AddTaskCounter.C");
237 AliAnalysisTask* count = AddTaskCounter(""); // All
238 AliAnalysisTask* countmb = AddTaskCounter("MB"); // Min Bias
239 AliAnalysisTask* countany = AddTaskCounter("Any");
240 AliAnalysisTask* countint = AddTaskCounter("AnyINT");// Min Bias
244 AliAnalysisTaskCounter* countemg = AddTaskCounter("EMCEGA");
245 AliAnalysisTaskCounter* countemj = AddTaskCounter("EMCEJE");
246 if(kCollision=="PbPb")
248 AliAnalysisTaskCounter* countcen = AddTaskCounter("Central");
249 AliAnalysisTaskCounter* countsce = AddTaskCounter("SemiCentral");
250 AliAnalysisTaskCounter* countssce= AddTaskCounter("SemiOrCentral");
251 AliAnalysisTaskCounter* countphP = AddTaskCounter("PHOSPb");
255 AliAnalysisTaskCounter* countem1 = AddTaskCounter("EMC1"); // Trig Th > 1.5 GeV approx
256 AliAnalysisTaskCounter* countem7 = AddTaskCounter("EMC7"); // Trig Th > 4-5 GeV
257 AliAnalysisTaskCounter* countphp = AddTaskCounter("PHOS");
264 if(kInputData=="ESD"){
265 printf("* Configure photon conversion analysis in macro \n");
266 TString arguments = "-run-on-train -use-own-xyz -force-aod -mc-off ";
267 gROOT->LoadMacro("$ALICE_ROOT/PWGGA/GammaConversion/macros/ConfigGammaConversion.C");
268 AliAnalysisTaskGammaConversion * taskGammaConversion =
269 ConfigGammaConversion(arguments,mgr->GetCommonInputContainer());
270 taskGammaConversion->SelectCollisionCandidates();
272 // Gamma Conversion AOD to AODPWG4Particle
273 AliAnalysisTaskGCPartToPWG4Part * taskGCToPC = new AliAnalysisTaskGCPartToPWG4Part("GCPartToPWG4Part");
274 taskGCToPC->SetGammaCutId("90035620401003321022000000090");
275 mgr->AddTask(taskGCToPC);
276 mgr->ConnectInput (taskGCToPC, 0, mgr->GetCommonInputContainer() );
277 mgr->ConnectOutput (taskGCToPC, 0, mgr->GetCommonOutputContainer());
281 Bool_t kPrint = kFALSE;
282 Bool_t deltaAOD = kFALSE;
283 gROOT->LoadMacro("AddTaskCaloTrackCorr.C"); // $ALICE_ROOT/PWGGA/CaloTrackCorrelations/macros
284 gROOT->LoadMacro("$ALICE_ROOT/PWGGA/EMCALTasks/macros/AddTaskEMCALClusterize.C"); // $ALICE_ROOT/PWGGA/EMCALTasks/macros
286 //gROOT->LoadMacro("$ALICE_ROOT/PWGGA/CaloTrackCorrelations/macros/QA/AddTaskCalorimeterQA.C");
287 //AliAnalysisTaskCaloTrackCorrelation * qatask = AddTaskCalorimeterQA(kInputData,kYear,kPrint,kMC);
289 //gROOT->LoadMacro("$ALICE_ROOT/PWGGA/EMCALTasks/macros/AddTaskEMCALTriggerQA.C");
290 //AliAnalysisTaskEMCALTriggerQA * qatrigtask = AddTaskEMCALTriggerQA();
292 // Calibration, bad map ...
294 Bool_t calibEE = kTRUE; // It is set automatically, but here we force to use it or not in any case
295 Bool_t calibTT = kTRUE; // It is set automatically, but here we force to use it or not in any case
296 if(kRun < 122195 || (kRun > 126437 && kRun < 136851) || kMC) calibTT=kFALSE ; // Recalibration parameters not available for LHC10a,b,c,e,f,g
297 Bool_t badMap = kTRUE; // It is set automatically, but here we force to use it or not in any case
301 printf("==================================== \n");
302 printf("CONFIGURE ANALYSIS FOR PP COLLISIONS \n");
303 printf("==================================== \n");
305 Bool_t mixing = kTRUE; // mixing in reader and hadron correlation, and pi0
307 Bool_t reTM = kFALSE; // Recalculate matches if not already done in clusterizer
308 Bool_t anTM = kTRUE; // Remove matched
309 Bool_t exo = kTRUE; // Remove exotic cells
310 Bool_t clnonlin = kTRUE; // Apply non linearity (clusterization)
311 Bool_t annonlin = kFALSE; // Apply non linearity (analysis)
312 Int_t minEcell = 50; // 50 MeV (10 MeV used in reconstruction)
313 Int_t minEseed = 100; // 100 MeV
314 Int_t dTime = 0; // default, 250 ns
315 Int_t wTime = 30; // default 425 < T < 825 ns, careful if time calibration is on
316 Int_t unfMinE = 15; // Remove cells with less than 15 MeV from cluster after unfolding
317 Int_t unfFrac = 1; // Remove cells with less than 1% of cluster energy after unfolding
320 TString clTrigger = "";
321 TString anTrigger = "EMC7";
331 Bool_t selectEvents = kFALSE; // Select events depending on V0, pile-up and vertex quality
332 Bool_t qa = kTRUE; // Do besides calorimeter QA analysis
333 Bool_t hadron = kTRUE; // Do besides charged track correlations analysis
335 //Analysis with clusterizer V1
337 TString arrayNameV1 = "";
339 AliAnalysisTaskEMCALClusterize * clv1 = AddTaskEMCALClusterize(arrayNameV1,outAOD,kMC,exo,"V1",clTrigger, clTM,
340 minEcell,minEseed,dTime,wTime,unfMinE,unfFrac,
341 calibEE,badMap,calibTT,clnonlin);
343 printf("Name of clusterizer1 array: %s\n",arrayNameV1.Data());
348 AliAnalysisTaskCaloTrackCorrelation *anav1trig = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
349 kYear,kCollision,anTrigger,arrayNameV1,mixing,reTM,anTM,
350 -1,-1, qa, hadron,calibEE,badMap,calibTT,deltaAOD,kPrint,scale);
353 AliAnalysisTaskCaloTrackCorrelation *anav1mb = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
354 kYear,kCollision,"AnyINT",arrayNameV1,mixing,reTM,anTM,
355 -1,-1, qa, hadron,calibEE,badMap,calibTT,deltaAOD,kPrint,scale);
359 //Analysis with clusterizer V2
360 TString arrayNameV2 = "";
361 AliAnalysisTaskEMCALClusterize * clv2 = AddTaskEMCALClusterize(arrayNameV2,outAOD,kMC,exo,"V2",clTrigger, clTM,
362 minEcell,minEseed,dTime,wTime,
363 calibEE,badMap,calibTT,clnonlin);
365 printf("Name of clusterizer2 array: %s\n",arrayNameV2.Data());
372 AliAnalysisTaskCaloTrackCorrelation *anav2tr = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
373 kYear,kCollision,anTrigger,arrayNameV2,mixing,reTM,anTM,
374 -1,-1,qa,hadron,calibEE,badMap,calibTT,deltaAOD,kPrint,scale);
378 AliAnalysisTaskCaloTrackCorrelation *anav2mb = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
379 kYear,kCollision,"AnyINT",arrayNameV2,mixing,reTM,anTM,
380 -1,-1, qa, hadron,calibEE,badMap,calibTT,deltaAOD,kPrint,scale);
383 if(kCollision=="PbPb")
385 printf("====================================== \n");
386 printf("CONFIGURE ANALYSIS FOR PbPb COLLISIONS \n");
387 printf("====================================== \n");
388 Bool_t mixing = kTRUE;
390 Bool_t reTM = kFALSE; // Recalculate matches if not already done in clusterizer
391 Bool_t anTM = kTRUE; // Remove matched
392 Bool_t exo = kTRUE; // Remove exotic cells
393 Bool_t clnonlin = kTRUE; // Apply non linearity (clusterization)
394 Bool_t annonlin = kFALSE; // Apply non linearity (analysis)
395 Int_t minEcell = 150; // 50 MeV (10 MeV used in reconstruction)
396 Int_t minEseed = 300; // 100 MeV
397 Int_t dTime = 0; // default, 250 ns
398 Int_t wTime = 0; // default 425 < T < 825 ns
399 Int_t unfMinE = 15; // Remove cells with less than 15 MeV from cluster after unfolding
400 Int_t unfFrac = 1; // Remove cells with less than 1% of cluster energy after unfolding
403 TString clTrigger = "";
404 TString anTrigger = "EMCGA";
413 Bool_t selectEvents = kFALSE; // Select events depending on V0, pile-up and vertex quality
414 Bool_t qa = kTRUE; // Do besides calorimeter QA analysis
415 Bool_t hadron = kTRUE; // Do besides charged track correlations analysis
417 //Analysis with clusterizer V1
419 TString arrayNameV1 = "";
420 AliAnalysisTaskEMCALClusterize * clv1 = AddTaskEMCALClusterize(arrayNameV1,outAOD,kMC,exo,"V1",clTrigger, clTM,
421 minEcell,minEseed,dTime,wTime,unfMinE,unfFrac,
422 calibEE,badMap,calibTT,clnonlin);
424 printf("Name of clusterizer1 array: %s\n",arrayNameV1.Data());
428 AliAnalysisTaskCaloTrackCorrelation *anav1c = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
429 kYear,kCollision,anTrigger,arrayNameV1,mixing,reTM,anTM,
430 0,20,qa,hadron,calibEE,badMap,calibTT,deltaAOD,kPrint);
431 AliAnalysisTaskCaloTrackCorrelation *anav1m = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
432 kYear,kCollision,anTrigger,arrayNameV1,mixing,reTM,anTM,
433 20,40,qa,hadron,calibEE,badMap,calibTT,deltaAOD,kPrint);
434 AliAnalysisTaskCaloTrackCorrelation *anav1p = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
435 kYear,kCollision,anTrigger,arrayNameV1,mixing,reTM,anTM,
436 60,80,qa,hadron,calibEE,badMap,calibTT,deltaAOD,kPrint);
439 //Analysis with clusterizer V2
441 TString arrayNameV2 = "";
442 AliAnalysisTaskEMCALClusterize * clv2 = AddTaskEMCALClusterize(arrayNameV2,outAOD,kMC,exo,"V2",clTrigger, clTM,
443 minEcell,minEseed,dTime,wTime,unfMinE,unfFrac,
444 calibEE,badMap,calibTT,clnonlin);
446 printf("Name of clusterizer2 array: %s\n",arrayNameV2.Data());
453 AliAnalysisTaskCaloTrackCorrelation *anav2cT = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
454 kYear,kCollision,anTrigger,arrayNameV2,mixing,reTM,anTM,
455 0,20,qa,hadron,calibEE,badMap,calibTT,deltaAOD,kPrint);
456 AliAnalysisTaskCaloTrackCorrelation *anav2mT = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
457 kYear,kCollision,anTrigger,arrayNameV2,mixing,reTM,anTM,
458 20,40,qa,hadron,calibEE,badMap,calibTT,deltaAOD,kPrint);
459 AliAnalysisTaskCaloTrackCorrelation *anav2pT = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
460 kYear,kCollision,anTrigger,arrayNameV2,mixing,reTM,anTM,
461 60,80,qa,hadron,calibEE,badMap,calibTT,deltaAOD,kPrint);
464 AliAnalysisTaskCaloTrackCorrelation *anav2cMB = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
465 kYear,kCollision,"AnyINT",arrayNameV2,mixing,reTM,anTM,
466 0,20,qa,hadron,calibEE,badMap,calibTT,deltaAOD,kPrint);
467 AliAnalysisTaskCaloTrackCorrelation *anav2mMB = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
468 kYear,kCollision,"AnyINT",arrayNameV2,mixing,reTM,anTM,
469 20,40,qa,hadron,calibEE,badMap,calibTT,deltaAOD,kPrint);
470 AliAnalysisTaskCaloTrackCorrelation *anav2pMB = AddTaskCaloTrackCorr(kInputData, "EMCAL", kMC, selectEvents, exo, annonlin, outputFile.Data(),
471 kYear,kCollision,"AnyINT",arrayNameV2,mixing,reTM,anTM,
472 60,80,qa,hadron,calibEE,badMap,calibTT,deltaAOD,kPrint);
479 //-----------------------
481 //-----------------------
485 if (mode == mPlugin) mgr->StartAnalysis("grid");
486 else if (mode == mPROOF ) mgr->StartAnalysis("proof",chain);
487 else mgr->StartAnalysis("local",chain);
489 cout <<" Analysis ended sucessfully "<< endl ;
493 //_____________________________
494 void LoadLibraries(Int_t mode)
497 if (mode == mPROOF) {
498 //TProof::Mgr("ccalpmaster")->SetROOTVersion("ALICE_v5-27-06b");
499 gROOT->LoadMacro("/afs/in2p3.fr/group/alice/laf/EnableAliRootForLAF.C");
500 TProof* proof = EnableAliRootForLAF("ccaplmaster",nPROOFWorkers.Data(),ccin2p3UserName.Data(),alienUserName.Data(),"",kFALSE,kTRUE,kTRUE,"OADB:ANALYSIS:ANALYSISalice:AOD:ESD:CORRFW:STEERBase:EMCALUtils:PHOSUtils:PWGCaloTrackCorrBase:PWGGACaloTrackCorrelations:PWGEMCAL:PWGGAEMCALTasks");
502 // TProof* proof = TProof::Open("ccaplmaster",Form("workers=%s",nPROOFWorkers.Data()));
504 // //proof->ClearPackages();
505 // proof->UploadPackage("STEERBase");
506 // proof->UploadPackage("ESD");
507 // proof->UploadPackage("AOD");
508 // proof->UploadPackage("ANALYSIS");
509 // proof->UploadPackage("OADB");
510 // proof->UploadPackage("ANALYSISalice");
511 // proof->UploadPackage("CORRFW");
512 // //proof->UploadPackage("JETAN");
513 // proof->UploadPackage("PHOSUtils");
514 // proof->UploadPackage("EMCALUtils");
515 // proof->UploadPackage("PWGCaloTrackCorrBase");
516 // proof->UploadPackage("PWGGACaloTrackCorrelations");
517 // proof->UploadPackage("PWGEMCAL");
518 // proof->UploadPackage("PWGGAEMCALTasks");
520 // proof->EnablePackage("STEERBase");
521 // proof->EnablePackage("ESD");
522 // proof->EnablePackage("AOD");
523 // proof->EnablePackage("ANALYSIS");
524 // proof->EnablePackage("OADB");
525 // proof->EnablePackage("ANALYSISalice");
526 // proof->EnablePackage("CORRFW");
527 // //proof->EnablePackage("JETAN");
528 // proof->EnablePackage("PHOSUtils");
529 // proof->EnablePackage("EMCALUtils");
530 // proof->EnablePackage("PWGCaloTrackCorrBase");
531 // proof->EnablePackage("PWGGACaloTrackCorrelations");
532 // proof->EnablePackage("PWGEMCAL");
533 // proof->EnablePackage("PWGGAEMCALTasks");
537 //--------------------------------------
538 // Load the needed libraries most of them already loaded by aliroot
539 //--------------------------------------
540 gSystem->Load("libTree.so");
541 gSystem->Load("libGeom.so");
542 gSystem->Load("libVMC.so");
543 gSystem->Load("libXMLIO.so");
544 gSystem->Load("libMatrix.so");
545 gSystem->Load("libPhysics.so");
546 gSystem->Load("libMinuit.so"); // Root + libraries to if reclusterization is done
548 gSystem->Load("libSTEERBase.so");
549 gSystem->Load("libGui.so"); // Root + libraries to if reclusterization is done
550 gSystem->Load("libCDB.so"); // Root + libraries to if reclusterization is done
551 gSystem->Load("libESD.so"); // Root + libraries to if reclusterization is done
552 gSystem->Load("libAOD.so");
553 gSystem->Load("libRAWDatabase.so"); // Root + libraries to if reclusterization is done
554 gSystem->Load("libProof.so");
555 gSystem->Load("libOADB");
556 gSystem->Load("libANALYSIS.so");
557 gSystem->Load("libSTEER.so"); // Root + libraries to if reclusterization is done
559 gSystem->Load("libRAWDatarec.so"); // Root + libraries to if reclusterization is done
560 gSystem->Load("libRAWDatasim.so"); // Root + libraries to if reclusterization is done
561 gSystem->Load("libVZERObase.so"); // Root + libraries to if reclusterization is done
562 gSystem->Load("libVZEROrec.so"); // Root + libraries to if reclusterization is done
564 gSystem->Load("libEMCALUtils");
565 //SetupPar("EMCALUtils");
566 gSystem->Load("libEMCALraw"); // Root + libraries to if reclusterization is done
567 gSystem->Load("libEMCALbase"); // Root + libraries to if reclusterization is done
568 gSystem->Load("libEMCALsim"); // Root + libraries to if reclusterization is done
569 gSystem->Load("libEMCALrec"); // Root + libraries to if reclusterization is done
570 //SetupPar("EMCALraw");
571 //SetupPar("EMCALbase");
572 //SetupPar("EMCALsim");
573 //SetupPar("EMCALrec");
575 gSystem->Load("libANALYSISalice.so");
576 //gSystem->Load("libTENDER.so");
577 //gSystem->Load("libTENDERSupplies.so");
579 gSystem->Load("libPHOSUtils");
580 gSystem->Load("libEMCALUtils");
581 gSystem->Load("libPWGCaloTrackCorrBase");
582 gSystem->Load("libPWGGACaloTrackCorrelations");
583 gSystem->Load("libPWGEMCAL");
584 gSystem->Load("libPWGGAEMCALTasks");
585 //SetupPar("PWGCaloTrackCorrBase");
586 //SetupPar("PWGGACaloTrackCorrelations");
587 //SetupPar("PWGEMCAL");
588 //SetupPar("PWGGAEMCALTasks");
591 //gSystem->Load("libJETAN");
592 //gSystem->Load("FASTJETAN");
593 //gSystem->Load("PWGJE");
595 //gSystem->Load("libCORRFW.so");
596 //gSystem->Load("libPWGGAGammaConv.so");
597 //SetupPar("PWGGAGammaConv");
599 // needed for plugin?
600 gSystem->AddIncludePath("-I$ALICE_ROOT");
601 gSystem->AddIncludePath("-I./");
605 //_________________________________
606 void SetupPar(char* pararchivename)
608 //Load par files, create analysis libraries
609 //For testing, if par file already decompressed and modified
610 //classes then do not decompress.
612 TString cdir(Form("%s", gSystem->WorkingDirectory() )) ;
613 TString parpar(Form("%s.par", pararchivename)) ;
615 if ( gSystem->AccessPathName(pararchivename) ) {
616 TString processline = Form(".! tar xvzf %s",parpar.Data()) ;
617 gROOT->ProcessLine(processline.Data());
620 TString ocwd = gSystem->WorkingDirectory();
621 gSystem->ChangeDirectory(pararchivename);
623 // check for BUILD.sh and execute
624 if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {
625 printf("*******************************\n");
626 printf("*** Building PAR archive ***\n");
627 cout<<pararchivename<<endl;
628 printf("*******************************\n");
630 if (gSystem->Exec("PROOF-INF/BUILD.sh")) {
631 Error("runProcess","Cannot Build the PAR Archive! - Abort!");
635 // check for SETUP.C and execute
636 if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {
637 printf("*******************************\n");
638 printf("*** Setup PAR archive ***\n");
639 cout<<pararchivename<<endl;
640 printf("*******************************\n");
641 gROOT->Macro("PROOF-INF/SETUP.C");
644 gSystem->ChangeDirectory(ocwd.Data());
645 printf("Current dir: %s\n", ocwd.Data());
648 //______________________________________
649 void CheckInputData(const anaModes mode)
651 //Sets input data and tree
653 TString ocwd = gSystem->WorkingDirectory();
655 //---------------------------------------
656 //Local files analysis
657 //---------------------------------------
659 //If you want to add several ESD files sitting in a common directory INDIR
660 //Specify as environmental variables the directory (INDIR), the number of files
661 //to analyze (NFILES) and the pattern name of the directories with files (PATTERN)
663 if(gSystem->Getenv("INDIR"))
664 kInDir = gSystem->Getenv("INDIR") ;
665 else cout<<"INDIR not set, use default: "<<kInDir<<endl;
667 TString sindir(kInDir);
668 if (sindir.Contains("pass1")) kPass = "pass1";
669 else if(sindir.Contains("pass2")) kPass = "pass2";
670 else if(sindir.Contains("pass3")) kPass = "pass3";
672 if(gSystem->Getenv("PATTERN"))
673 kPattern = gSystem->Getenv("PATTERN") ;
674 else cout<<"PATTERN not set, use default: "<<kPattern<<endl;
676 cout<<"INDIR : "<<kInDir<<endl;
677 cout<<"NFILES : "<<kFile<<endl;
683 for (Int_t event = 0 ; event < kFile ; event++) {
684 sprintf(fileE, "%s/%s%d/AliESDs.root", kInDir,kPattern,event) ;
685 sprintf(fileA, "%s/%s%d/AliAOD.root", kInDir,kPattern,event) ;
686 sprintf(fileG, "%s/%s%d/galice.root", kInDir,kPattern,event) ;
687 sprintf(fileEm, "%s/%s%d/embededAOD.root", kInDir,kPattern,event) ;
689 TFile * fESD = TFile::Open(fileE) ;
690 TFile * fAOD = TFile::Open(fileA) ;
692 //Check if file exists and add it, if not skip it
695 kTreeName = "esdTree";
697 TFile * fG = TFile::Open(fileG);
698 if(fG) { kMC = kTRUE; fG->Close();}
702 TTree* esdTree = (TTree*)fESD->Get("esdTree");
703 AliESDEvent* esd = new AliESDEvent();
704 esd->ReadFromTree(esdTree);
705 esdTree->GetEvent(0);
706 kRun = esd->GetRunNumber();
712 kTreeName = "aodTree";
714 if(((TTree*) fAOD->Get("aodTree"))->GetBranch("mcparticles")) kMC=kTRUE;
718 TTree* aodTree = (TTree*)fAOD->Get("aodTree");
719 AliAODEvent* aod = new AliAODEvent();
720 aod->ReadFromTree(aodTree);
721 aodTree->GetEvent(0);
722 kRun = aod->GetRunNumber();
725 else if(TFile::Open(fileEm))
727 kTreeName = "aodTree";
733 else if(TFile::Open(fileG))
742 if(fESD) fESD->Close();
743 if(fAOD) fAOD->Close();
745 }// local files analysis
747 //------------------------------
749 //-----------------------------
750 else if(mode == mGRID){
751 //Get colection file. It is specified by the environmental
754 if(gSystem->Getenv("XML") )
755 kXML = gSystem->Getenv("XML");
757 sprintf(kXML, "collection.xml") ;
759 if (!TFile::Open(kXML)) {
760 printf("No collection file with name -- %s -- was found\n",kXML);
763 else cout<<"XML file "<<kXML<<endl;
765 //Load necessary libraries and connect to the GRID
766 gSystem->Load("libNetx.so") ;
767 gSystem->Load("libRAliEn.so");
768 TGrid::Connect("alien://") ;
770 //Feed Grid with collection file
771 TGridCollection * collection = (TGridCollection*) TAlienCollection::Open(kXML);
773 AliError(Form("%s not found", kXML)) ;
776 TGridResult* result = collection->GetGridResult("",0 ,0);
778 for (Int_t index = 0; index < result->GetEntries(); index++) {
779 TString alienURL = result->GetKey(index, "turl") ;
780 cout << "================== " << alienURL << endl ;
782 if (alienURL.Contains("pass1")) kPass = "pass1";
783 else if(alienURL.Contains("pass2")) kPass = "pass2";
784 else if(alienURL.Contains("pass3")) kPass = "pass3";
786 kRun = AliAnalysisManager::GetRunFromAlienPath(alienURL.Data());
787 printf("Run number from alien path = %d\n",kRun);
790 //Check if file exists and add it, if not skip it
791 if (alienURL.Contains("AliESDs.root"))
793 kTreeName = "esdTree";
795 alienURL.ReplaceAll("AliESDs.root","galice.root");
796 if(TFile::Open(alienURL)) kMC=kTRUE;
800 else if(alienURL.Contains("AliAOD.root"))
802 kTreeName = "aodTree";
804 fAOD = TFile::Open(alienURL);
805 if(((TTree*) fAOD->Get("aodTree"))->GetBranch("mcparticles")) kMC=kTRUE;
809 else if(alienURL.Contains("embededAOD.root"))
811 kTreeName = "aodTree";
816 else if(alienURL.Contains("galice.root"))
825 //------------------------------
827 //-----------------------------
828 else if(mode == mPROOF){
830 TFileCollection* coll = gProof->GetDataSet(kDatasetPROOF)->GetStagedSubset();
832 TIter iter(coll->GetList());
834 TFileInfo* fileInfo = 0;
835 while ((fileInfo = dynamic_cast<TFileInfo*> (iter())))
837 if (fileInfo->GetFirstUrl()) {
838 TString ProofURL = fileInfo->GetFirstUrl()->GetUrl();
839 cout << "================== " << ProofURL << endl ;
841 if (ProofURL.Contains("pass1")) kPass = "pass1";
842 else if(ProofURL.Contains("pass2")) kPass = "pass2";
843 else if(ProofURL.Contains("pass3")) kPass = "pass3";
845 kRun = AliAnalysisManager::GetRunFromAlienPath(ProofURL.Data());
846 printf("Run number from alien path = %d\n",kRun);
849 //Check if file exists and add it, if not skip it
850 if (ProofURL.Contains("AliESDs.root"))
852 kTreeName = "esdTree";
854 alienURL.ReplaceAll("AliESDs.root","galice.root");
855 if(TFile::Open(ProofURL)) kMC=kTRUE;
860 else if(ProofURL.Contains("AliAOD.root"))
862 kTreeName = "aodTree";
864 fAOD = TFile::Open(ProofURL);
865 if(((TTree*) fAOD->Get("aodTree"))->GetBranch("mcparticles")) kMC=kTRUE;
869 else if(ProofURL.Contains("embededAOD.root"))
871 kTreeName = "aodTree";
876 else if(ProofURL.Contains("galice.root"))
887 gSystem->ChangeDirectory(ocwd.Data());
891 //_____________________________________________________________________
892 void CreateChain(const anaModes mode, TChain * chain, TChain * chainxs)
894 //Fills chain with data
895 TString ocwd = gSystem->WorkingDirectory();
897 //---------------------------------------
898 // Local files analysis
899 //---------------------------------------
901 //If you want to add several ESD files sitting in a common directory INDIR
902 //Specify as environmental variables the directory (INDIR), the number of files
903 //to analyze (NFILES) and the pattern name of the directories with files (PATTERN)
905 if(gSystem->Getenv("INDIR"))
906 kInDir = gSystem->Getenv("INDIR") ;
907 else cout<<"INDIR not set, use default: "<<kInDir<<endl;
909 if(gSystem->Getenv("PATTERN"))
910 kPattern = gSystem->Getenv("PATTERN") ;
911 else cout<<"PATTERN not set, use default: "<<kPattern<<endl;
913 if(gSystem->Getenv("NFILES"))
914 kFile = atoi(gSystem->Getenv("NFILES")) ;
915 else cout<<"NFILES not set, use default: "<<kFile<<endl;
917 //Check if env variables are set and are correct
918 if ( kInDir && kFile) {
919 printf("Get %d files from directory %s\n",kFile,kInDir);
920 if ( ! gSystem->cd(kInDir) ) {//check if ESDs directory exist
921 printf("%s does not exist\n", kInDir) ;
925 //if(gSystem->Getenv("XSFILE"))
926 //kXSFileName = gSystem->Getenv("XSFILE") ;
927 //else cout<<" XS file name not set, use default: "<<kXSFileName<<endl;
928 char * kGener = gSystem->Getenv("GENER");
930 cout<<"GENER "<<kGener<<endl;
931 if (!strcmp(kGener,"PYTHIA")) kXSFileName = "pyxsec.root";
932 else if(!strcmp(kGener,"HERWIG")) kXSFileName = "hexsec.root";
933 else cout<<" UNKNOWN GENER, use default: "<<kXSFileName<<endl;
935 else cout<<" GENER not set, use default xs file name: "<<kXSFileName<<endl;
937 cout<<"INDIR : "<<kInDir <<endl;
938 cout<<"NFILES : "<<kFile <<endl;
939 cout<<"PATTERN : "<<kPattern <<endl;
940 cout<<"XSFILE : "<<kXSFileName<<endl;
943 if (kInputData == "ESD") datafile = "AliESDs.root" ;
944 else if(kInputData.Contains("AOD")) datafile = "AliAOD.root" ;
945 else if(kInputData == "MC") datafile = "galice.root" ;
947 //Loop on ESD/AOD/MC files, add them to chain
953 for (event = 0 ; event < kFile ; event++) {
954 sprintf(file, "%s/%s%d/%s", kInDir,kPattern,event,datafile.Data()) ;
955 sprintf(filexs, "%s/%s%d/%s", kInDir,kPattern,event,kXSFileName) ;
957 //Check if file exists and add it, if not skip it
958 if ( fData = TFile::Open(file)) {
959 if ( fData->Get(kTreeName) ) {
960 printf("++++ Adding %s\n", file) ;
961 chain->AddFile(file);
962 chainxs->Add(filexs) ;
966 printf("---- Skipping %s\n", file) ;
972 TString input = "AliESDs.root" ;
973 cout<<">>>>>> No list added, take a single file <<<<<<<<< "<<input<<endl;
974 chain->AddFile(input);
977 }// local files analysis
979 //------------------------------
981 //------------------------------
982 else if(mode == mGRID){
983 //Get colection file. It is specified by the environmental
986 //Feed Grid with collection file
987 TGridCollection * collection = (TGridCollection*) TAlienCollection::Open(kXML);
989 AliError(Form("%s not found", kXML)) ;
993 TGridResult* result = collection->GetGridResult("",0 ,0);
995 // Makes the ESD chain
996 printf("*** Getting the Chain ***\n");
997 for (Int_t index = 0; index < result->GetEntries(); index++) {
998 TString alienURL = result->GetKey(index, "turl") ;
999 cout << "================== " << alienURL << endl ;
1000 chain->Add(alienURL) ;
1001 alienURL.ReplaceAll("AliESDs.root",kXSFileName);
1002 chainxs->Add(alienURL) ;
1006 //------------------------------
1008 //------------------------------
1009 else if (mode == mPROOF) {
1011 TFileCollection* ds= gProof->GetDataSet(kDatasetPROOF)->GetStagedSubset();
1013 gROOT->LoadMacro("/afs/in2p3.fr/group/alice/laf/dataset_management/CreateChainFromDataSet.C");
1014 chain = CreateChainFromDataSet(ds, kTreeName , kDatasetNMaxFiles);
1015 printf("chain has %d entries\n",chain->GetEntries());
1018 gSystem->ChangeDirectory(ocwd.Data());
1022 //______________________________
1023 void CheckEnvironmentVariables()
1026 sprintf(kTrigger,"");
1028 Bool_t bRecalibrate = kFALSE;
1029 Bool_t bBadChannel = kFALSE;
1031 for (int i=0; i< gApplication->Argc();i++){
1035 printf("Arg %d: %s\n",i,gApplication->Argv(i));
1041 if (!(strcmp(gApplication->Argv(i),"--trigger")))
1042 sprintf(trigger,gApplication->Argv(i+1));
1044 if (!(strcmp(gApplication->Argv(i),"--recalibrate")))
1045 bRecalibrate = atoi(gApplication->Argv(i+1));
1047 if (!(strcmp(gApplication->Argv(i),"--badchannel")))
1048 bBadChannel = atoi(gApplication->Argv(i+1));
1050 if (!(strcmp(gApplication->Argv(i),"--run"))){
1051 sRun = gApplication->Argv(i+1);
1052 if(sRun.Contains("LHC10")) {
1057 kRun = atoi(gApplication->Argv(i+1));
1059 else printf("** Run number already set to %d, do not set to %d\n",kRun,atoi(gApplication->Argv(i+1)));
1065 if(!sRun.Contains("LHC10")){
1069 if( kRun >= 136851 ) kCollision = "PbPb";
1071 else if( kRun < 170600)
1074 if( kRun >= 166500 ) kCollision = "PbPb";
1083 if(kMC) sprintf(kTrigger,"");
1085 printf("*********************************************\n");
1086 //printf("*** Settings trigger %s, recalibrate %d, remove bad channels %d, year %d, collision %s, run %d ***\n",
1087 // kTrigger,bRecalibrate,bBadChannel, kYear,kCollision.Data(), kRun);
1088 printf("*** Settings year %d, collision %s, run %d ***\n",kYear,kCollision.Data(), kRun);
1089 printf("*********************************************\n");
1093 //_________________________________________________________________
1094 void GetAverageXsection(TTree * tree, Double_t & xs, Float_t & ntr)
1096 // Read the PYTHIA statistics from the file pyxsec.root created by
1097 // the function WriteXsection():
1098 // integrated cross section (xsection) and
1099 // the number of Pyevent() calls (ntrials)
1100 // and calculate the weight per one event xsection/ntrials
1101 // The spectrum calculated by a user should be
1102 // multiplied by this weight, something like this:
1103 // TH1F *userSpectrum ... // book and fill the spectrum
1104 // userSpectrum->Scale(weight)
1106 // Yuri Kharlov 19 June 2007
1107 // Gustavo Conesa 15 April 2008
1108 Double_t xsection = 0;
1113 Int_t nfiles = tree->GetEntries() ;
1114 if (tree && nfiles > 0) {
1115 tree->SetBranchAddress("xsection",&xsection);
1116 tree->SetBranchAddress("ntrials" ,&ntrials );
1117 for(Int_t i = 0; i < nfiles; i++){
1121 cout << "xsection " <<xsection<<" ntrials "<<ntrials<<endl;
1126 cout << "-----------------------------------------------------------------"<<endl;
1127 cout << "Average of "<< nfiles<<" files: xsection " <<xs<<" ntrials "<<ntr<<endl;
1128 cout << "-----------------------------------------------------------------"<<endl;
1130 else cout << " >>>> Empty tree !!!! <<<<< "<<endl;