0a31bdf50a7f991d0c06ff0f274598403a4bc887
[u/mrichter/AliRoot.git] / PWGGA / CaloTrackCorrelations / macros / anaGenKine.C
1 /* $Id:  $ */
2 //--------------------------------------------------
3 // Example macro to do analysis with the 
4 // analysis classes in CaloTrackCorrelations
5 // Can be executed with Root and AliRoot
6 //
7 // Pay attention to the options and definitions
8 // set in the lines below
9 //
10 //  Author : Gustavo Conesa Balbastre (INFN-LNF)
11 //
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
18
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
23
24 char * kInDir   = "/user/data/files/"; 
25 char * kPattern = ""; // Data are in files kInDir/kPattern+i 
26 Int_t  kFile    = 6; 
27
28 //---------------------------------------------------------------------------
29 // Dataset for proof analysis, mode=mPROOF
30 // char * kDataset = "/alice/vernet/PbPb_LHC10h_ESD";
31
32 char *  kDatasetPROOF     = "/alice/vernet/LHC11b_149646";
33 Int_t   kDatasetNMaxFiles = 20;
34 TString ccin2p3UserName   = "arbor" ;
35 TString alienUserName     = "narbor" ;
36
37 //---------------------------------------------------------------------------
38 // Collection file for grid analysis
39
40 char * kXML = "collection.xml";
41
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";
48
49 //---------------------------------------------------------------------------
50
51 //Set some default values, but used values are set in the code!
52
53 Bool_t  kMC        = kFALSE; //With real data kMC = kFALSE
54 TString kInputData = "ESD"; //ESD, AOD, MC, deltaAOD
55 Int_t   kYear      = 2011;
56 TString kCollision = "pp";
57 Bool_t  outAOD     = kFALSE; //Some tasks doesnt need it.
58 TString kTreeName;
59 TString kPass      = "";
60 char    kTrigger[1024];
61 Int_t   kRun       = 0;
62
63 //________________________
64 void anaGenKine(Int_t mode=mGRID)
65 {
66   // Main
67   
68   //--------------------------------------------------------------------
69   // Load analysis libraries
70   // Look at the method below, 
71   // change whatever you need for your analysis case
72   // ------------------------------------------------------------------
73   
74   LoadLibraries(mode) ;
75   //gSystem->ListLibraries();
76   
77   //-------------------------------------------------------------------------------------------------
78   //Create chain from ESD and from cross sections files, look below for options.
79   //-------------------------------------------------------------------------------------------------
80   
81   // Set kInputData and kTreeName looking to the kINDIR
82   
83   //CheckInputData(mode);
84   
85   // Check global analysis settings  
86   
87   //CheckEnvironmentVariables();
88   
89   //printf("*********************************************\n");
90   //printf("*** Input data < %s >, pass %s, tree < %s >, MC?  < %d > ***\n",kInputData.Data(),kPass.Data(),kTreeName.Data(),kMC);
91   
92   //printf("*********************************************\n");
93   kTreeName  = "TE";
94   kInputData = "MC";
95   TChain * chain   = new TChain(kTreeName) ;
96   TChain * chainxs = new TChain("Xsection") ;
97   
98   chain  ->AddFile("galice.root");
99   chainxs->AddFile("pyxsec.root");
100
101   //CreateChain(mode, chain, chainxs); 
102   
103   Double_t scale = -1;
104   printf("===== kMC %d, chainxs %p\n",kMC,chainxs);
105   if(chainxs && chainxs->GetEntries() > 0)
106   {
107     Int_t nfiles = chainxs->GetEntries();
108     
109     //Get the cross section
110     Double_t xsection = 0; 
111     Float_t ntrials   = 0;
112     
113     GetAverageXsection(chainxs, xsection, ntrials);
114     
115     Int_t    nEventsPerFile = chain->GetEntries() / nfiles;
116     
117     Double_t trials = ntrials / nEventsPerFile ;
118     
119     scale = xsection/trials;
120     
121     printf("Get Cross section : nfiles  %d, nevents %d, nevents per file %d \n",nfiles, chain->GetEntries(),nEventsPerFile);     
122     printf("                    ntrials %d, trials %2.2f, xs %2.2e, scale factor %2.2e\n", ntrials,trials,xsection,scale);
123     
124   } 
125   
126   printf("*********************************************\n");
127   printf("number of entries # %lld, skipped %d\n", chain->GetEntries()) ;       
128   printf("*********************************************\n");
129   
130   if(!chain)
131   { 
132     printf("STOP, no chain available\n"); 
133     return;
134   }
135   
136   AliLog::SetGlobalLogLevel(AliLog::kError);//Minimum prints on screen
137   
138   //------------------------------------------
139   //  Alien handler part
140   //------------------------------------------
141   AliAnalysisGrid *alienHandler=0x0;
142   if(mode==mPlugin)
143   {
144     // Create and configure the alien handler plugin
145     gROOT->LoadMacro("CreateAlienHandler.C");
146     alienHandler = CreateAlienHandler();
147     if (!alienHandler) return;
148   }  
149   
150   //--------------------------------------
151   // Make the analysis manager
152   //-------------------------------------
153   AliAnalysisManager *mgr  = new AliAnalysisManager("Manager", "Manager");
154   //AliAnalysisManager::SetUseProgressBar(kTRUE);
155   //mgr->SetSkipTerminate(kTRUE);
156   //mgr->SetNSysInfo(1);
157   
158 //  if(mode==mPlugin)
159 //  {
160 //    // Connect plugin to the analysis manager
161 //    mgr->SetGridHandler(alienHandler);
162 //  }
163   
164   // MC handler
165   if((kMC || kInputData == "MC") && !kInputData.Contains("AOD"))
166   {
167     AliMCEventHandler* mcHandler = new AliMCEventHandler();
168     mcHandler->SetReadTR(kFALSE);//Do not search TrackRef file
169     mgr->SetMCtruthEventHandler(mcHandler);
170     if( kInputData == "MC") 
171     {
172       cout<<"MC INPUT EVENT HANDLER"<<endl;
173       mgr->SetInputEventHandler(NULL);
174     }
175   }
176   
177   
178 //  // AOD output handler
179 //  if(kInputData!="deltaAOD" && outAOD)
180 //  {
181 //    cout<<"Init output handler"<<endl;
182 //    AliAODHandler* aodoutHandler   = new AliAODHandler();
183 //    aodoutHandler->SetOutputFileName("aod.root");
184 //    ////aodoutHandler->SetCreateNonStandardAOD();
185 //    mgr->SetOutputEventHandler(aodoutHandler);
186 //  }
187 //  
188 //  //input
189 //  
190 //  if(kInputData == "ESD")
191 //  {
192 //    // ESD handler
193 //    AliESDInputHandler *esdHandler = new AliESDInputHandler();
194 //    esdHandler->SetReadFriends(kFALSE);
195 //    mgr->SetInputEventHandler(esdHandler);
196 //    cout<<"ESD handler "<<mgr->GetInputEventHandler()<<endl;
197 //  }
198 //  else if(kInputData.Contains("AOD"))
199 //  {
200 //    // AOD handler
201 //    AliAODInputHandler *aodHandler = new AliAODInputHandler();
202 //    mgr->SetInputEventHandler(aodHandler);
203 //    if(kInputData == "deltaAOD") aodHandler->AddFriend("deltaAODCaloTrackCorr.root");
204 //    cout<<"AOD handler "<<mgr->GetInputEventHandler()<<endl;
205 //  }
206   
207   //mgr->RegisterExternalFile("deltaAODCaloTrackCorr.root");
208   mgr->SetDebugLevel(1); // For debugging, do not uncomment if you want no messages.
209   
210   TString outputFile = AliAnalysisManager::GetCommonFileName(); 
211    
212   gROOT->LoadMacro("AddTaskGenKine.C");  
213   
214  
215   AliAnalysisTaskCaloTrackCorrelation *ana   = AddTaskGenKine(outputFile, scale);
216     
217   
218   //-----------------------
219   // Run the analysis
220   //-----------------------    
221   mgr->InitAnalysis();
222   mgr->PrintStatus();
223   
224   if      (mode == mPlugin) mgr->StartAnalysis("grid");
225   else if (mode == mPROOF ) mgr->StartAnalysis("proof",chain);
226   else                      mgr->StartAnalysis("local",chain);
227   
228   cout <<" Analysis ended sucessfully "<< endl ;
229   
230 }
231
232 //_____________________________
233 void  LoadLibraries(Int_t mode)
234 {
235   
236   if (mode == mPROOF) {
237     //TProof::Mgr("ccalpmaster")->SetROOTVersion("ALICE_v5-27-06b");
238     gROOT->LoadMacro("/afs/in2p3.fr/group/alice/laf/EnableAliRootForLAF.C");
239     TProof* proof = EnableAliRootForLAF("ccaplmaster",nPROOFWorkers.Data(),ccin2p3UserName.Data(),alienUserName.Data(),"",kFALSE,kTRUE,kTRUE,"OADB:ANALYSIS:ANALYSISalice:AOD:ESD:CORRFW:STEERBase:EMCALUtils:PHOSUtils:PWGCaloTrackCorrBase:PWGGACaloTrackCorrelations:PWGGAEMCALTasks");
240     
241     //  TProof* proof = TProof::Open("ccaplmaster",Form("workers=%s",nPROOFWorkers.Data()));
242     
243     //     //proof->ClearPackages();
244     //     proof->UploadPackage("STEERBase");
245     //     proof->UploadPackage("ESD");
246     //     proof->UploadPackage("AOD");
247     //     proof->UploadPackage("ANALYSIS");
248     //     proof->UploadPackage("OADB");
249     //     proof->UploadPackage("ANALYSISalice");
250     //     proof->UploadPackage("CORRFW");
251     //     //proof->UploadPackage("JETAN");
252     //     proof->UploadPackage("PHOSUtils");
253     //     proof->UploadPackage("EMCALUtils");
254     //     proof->UploadPackage("PWGCaloTrackCorrBase");
255     //     proof->UploadPackage("PWGGACaloTrackCorrelations");
256     //     proof->UploadPackage("PWGGAEMCALTasks");
257     
258     //     proof->EnablePackage("STEERBase");
259     //     proof->EnablePackage("ESD");
260     //     proof->EnablePackage("AOD");
261     //     proof->EnablePackage("ANALYSIS");
262     //     proof->EnablePackage("OADB");
263     //     proof->EnablePackage("ANALYSISalice");
264     //     proof->EnablePackage("CORRFW");
265     //     //proof->EnablePackage("JETAN");
266     //     proof->EnablePackage("PHOSUtils");
267     //     proof->EnablePackage("EMCALUtils");
268     //     proof->EnablePackage("PWGCaloTrackCorrBase");
269     //     proof->EnablePackage("PWGGACaloTrackCorrelations");
270     //     proof->EnablePackage("PWGGAEMCALTasks");
271     return;
272   }  
273   
274   //--------------------------------------
275   // Load the needed libraries most of them already loaded by aliroot
276   //--------------------------------------
277   gSystem->Load("libTree.so");
278   gSystem->Load("libGeom.so");
279   gSystem->Load("libVMC.so");
280   gSystem->Load("libXMLIO.so");
281   gSystem->Load("libMatrix.so");
282   gSystem->Load("libPhysics.so");
283   gSystem->Load("libMinuit.so"); // Root + libraries to if reclusterization is done
284   
285   gSystem->Load("libSTEERBase.so");
286   gSystem->Load("libGui.so"); // Root + libraries to if reclusterization is done
287   gSystem->Load("libCDB.so"); // Root + libraries to if reclusterization is done
288   gSystem->Load("libESD.so"); // Root + libraries to if reclusterization is done
289   gSystem->Load("libAOD.so");
290   gSystem->Load("libRAWDatabase.so"); // Root + libraries to if reclusterization is done
291   gSystem->Load("libProof.so"); 
292   gSystem->Load("libOADB");
293   gSystem->Load("libANALYSIS.so");
294   gSystem->Load("libSTEER.so"); // Root + libraries to if reclusterization is done
295   
296   gSystem->Load("libRAWDatarec.so"); // Root + libraries to if reclusterization is done
297   gSystem->Load("libRAWDatasim.so"); // Root + libraries to if reclusterization is done
298   gSystem->Load("libVZERObase.so");  // Root + libraries to if reclusterization is done
299   gSystem->Load("libVZEROrec.so");   // Root + libraries to if reclusterization is done
300   
301   gSystem->Load("libEMCALUtils");
302   //SetupPar("EMCALUtils");
303   gSystem->Load("libEMCALraw");  // Root + libraries to if reclusterization is done
304   gSystem->Load("libEMCALbase"); // Root + libraries to if reclusterization is done
305   gSystem->Load("libEMCALsim");  // Root + libraries to if reclusterization is done
306   gSystem->Load("libEMCALrec");  // Root + libraries to if reclusterization is done
307   //SetupPar("EMCALraw");
308   //SetupPar("EMCALbase");
309   //SetupPar("EMCALsim");
310   //SetupPar("EMCALrec");
311   
312   gSystem->Load("libANALYSISalice.so");
313   //gSystem->Load("libTENDER.so"); 
314   //gSystem->Load("libTENDERSupplies.so");
315   
316   gSystem->Load("libPHOSUtils");
317   gSystem->Load("libEMCALUtils");
318   gSystem->Load("libPWGCaloTrackCorrBase");
319   gSystem->Load("libPWGGACaloTrackCorrelations");
320   gSystem->Load("libPWGGAEMCALTasks");
321   //SetupPar("PWGCaloTrackCorrBase");
322   //SetupPar("PWGGACaloTrackCorrelations");
323   //SetupPar("PWGGAEMCALTasks");
324   
325  
326   //gSystem->Load("libJETAN");
327   //gSystem->Load("FASTJETAN");
328   //gSystem->Load("PWGJE");
329
330   //gSystem->Load("libCORRFW.so");
331   //gSystem->Load("libPWGGAGammaConv.so"); 
332   //SetupPar("PWGGAGammaConv"); 
333   
334   // needed for plugin?
335   gSystem->AddIncludePath("-I$ALICE_ROOT");
336   gSystem->AddIncludePath("-I./");     
337   
338 }
339
340 //_________________________________
341 void SetupPar(char* pararchivename)
342 {
343   //Load par files, create analysis libraries
344   //For testing, if par file already decompressed and modified
345   //classes then do not decompress.
346   
347   TString cdir(Form("%s", gSystem->WorkingDirectory() )) ; 
348   TString parpar(Form("%s.par", pararchivename)) ; 
349   
350   if ( gSystem->AccessPathName(pararchivename) ) {  
351     TString processline = Form(".! tar xvzf %s",parpar.Data()) ;
352     gROOT->ProcessLine(processline.Data());
353   }
354   
355   TString ocwd = gSystem->WorkingDirectory();
356   gSystem->ChangeDirectory(pararchivename);
357   
358   // check for BUILD.sh and execute
359   if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {
360     printf("*******************************\n");
361     printf("*** Building PAR archive    ***\n");
362     cout<<pararchivename<<endl;
363     printf("*******************************\n");
364     
365     if (gSystem->Exec("PROOF-INF/BUILD.sh")) {
366       Error("runProcess","Cannot Build the PAR Archive! - Abort!");
367       return -1;
368     }
369   }
370   // check for SETUP.C and execute
371   if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {
372     printf("*******************************\n");
373     printf("*** Setup PAR archive       ***\n");
374     cout<<pararchivename<<endl;
375     printf("*******************************\n");
376     gROOT->Macro("PROOF-INF/SETUP.C");
377   }
378   
379   gSystem->ChangeDirectory(ocwd.Data());
380   printf("Current dir: %s\n", ocwd.Data());
381 }
382
383 //______________________________________
384 void CheckInputData(const anaModes mode)
385 {
386   //Sets input data and tree
387   
388   TString ocwd = gSystem->WorkingDirectory();
389   
390   //---------------------------------------
391   //Local files analysis
392   //---------------------------------------
393   if(mode == mLocal){    
394     //If you want to add several ESD files sitting in a common directory INDIR
395     //Specify as environmental variables the directory (INDIR), the number of files 
396     //to analyze (NFILES) and the pattern name of the directories with files (PATTERN)
397     
398     if(gSystem->Getenv("INDIR"))  
399       kInDir = gSystem->Getenv("INDIR") ; 
400     else cout<<"INDIR not set, use default: "<<kInDir<<endl;    
401     
402     TString sindir(kInDir);
403     if     (sindir.Contains("pass1")) kPass = "pass1";
404     else if(sindir.Contains("pass2")) kPass = "pass2";
405     else if(sindir.Contains("pass3")) kPass = "pass3";
406     
407     if(gSystem->Getenv("PATTERN"))   
408       kPattern = gSystem->Getenv("PATTERN") ; 
409     else  cout<<"PATTERN not set, use default: "<<kPattern<<endl;
410     
411     cout<<"INDIR   : "<<kInDir<<endl;
412     cout<<"NFILES  : "<<kFile<<endl;
413     
414     char fileE[120] ;   
415     char fileA[120] ;   
416     char fileG[120] ;
417     char fileEm[120] ;   
418     for (Int_t event = 0 ; event < kFile ; event++) {
419       sprintf(fileE,  "%s/%s%d/AliESDs.root",    kInDir,kPattern,event) ; 
420       sprintf(fileA,  "%s/%s%d/AliAOD.root",     kInDir,kPattern,event) ; 
421       sprintf(fileG,  "%s/%s%d/galice.root",     kInDir,kPattern,event) ; 
422       sprintf(fileEm, "%s/%s%d/embededAOD.root", kInDir,kPattern,event) ; 
423       
424       TFile * fESD = TFile::Open(fileE) ; 
425       TFile * fAOD = TFile::Open(fileA) ; 
426       
427       //Check if file exists and add it, if not skip it
428       if (fESD) 
429       {
430         kTreeName  = "esdTree";
431         kInputData = "ESD";
432         TFile * fG = TFile::Open(fileG);
433         if(fG) { kMC = kTRUE; fG->Close();}
434         else     kMC = kFALSE;
435         
436         // Get run number
437         TTree* esdTree = (TTree*)fESD->Get("esdTree");
438         AliESDEvent* esd = new AliESDEvent();
439         esd->ReadFromTree(esdTree);
440         esdTree->GetEvent(0);
441         kRun = esd->GetRunNumber();
442         
443         return;
444       }
445       else if(fAOD)
446       {
447         kTreeName  = "aodTree";
448         kInputData = "AOD";
449         if(((TTree*) fAOD->Get("aodTree"))->GetBranch("mcparticles")) kMC=kTRUE;
450         else kMC = kFALSE;
451         
452         // Get run number
453         TTree* aodTree = (TTree*)fAOD->Get("aodTree");
454         AliAODEvent* aod = new AliAODEvent();
455         aod->ReadFromTree(aodTree);
456         aodTree->GetEvent(0);
457         kRun = aod->GetRunNumber();
458         return;
459       }
460       else if(TFile::Open(fileEm))
461       {
462         kTreeName  = "aodTree";
463         kInputData = "AOD";
464         kMC        = kTRUE;
465         
466         return;
467       }
468       else if(TFile::Open(fileG))
469       {
470         kTreeName  = "TE";
471         kInputData = "MC";
472         kMC        = kTRUE;
473         return;
474       }
475     }
476     
477     if(fESD) fESD->Close();
478     if(fAOD) fAOD->Close();
479     
480   }// local files analysis
481   
482   //------------------------------
483   //GRID xml files
484   //-----------------------------
485   else if(mode == mGRID){
486     //Get colection file. It is specified by the environmental
487     //variable XML
488     
489     if(gSystem->Getenv("XML") )
490       kXML = gSystem->Getenv("XML");
491     else
492       sprintf(kXML, "collection.xml") ; 
493     
494     if (!TFile::Open(kXML)) {
495       printf("No collection file with name -- %s -- was found\n",kXML);
496       return ;
497     }
498     else cout<<"XML file "<<kXML<<endl;
499     
500     //Load necessary libraries and connect to the GRID
501     gSystem->Load("libNetx.so") ; 
502     gSystem->Load("libRAliEn.so"); 
503     TGrid::Connect("alien://") ;
504     
505     //Feed Grid with collection file
506     TGridCollection * collection = (TGridCollection*) TAlienCollection::Open(kXML);
507     if (! collection) {
508       AliError(Form("%s not found", kXML)) ; 
509       return kFALSE ; 
510     }
511     TGridResult* result = collection->GetGridResult("",0 ,0);
512     
513     for (Int_t index = 0; index < result->GetEntries(); index++) {
514       TString alienURL = result->GetKey(index, "turl") ; 
515       cout << "================== " << alienURL << endl ; 
516       
517       if     (alienURL.Contains("pass1")) kPass = "pass1";
518       else if(alienURL.Contains("pass2")) kPass = "pass2";
519       else if(alienURL.Contains("pass3")) kPass = "pass3";
520       
521       kRun = AliAnalysisManager::GetRunFromAlienPath(alienURL.Data());
522       printf("Run number from alien path = %d\n",kRun);
523       
524       TFile * fAOD = 0 ; 
525       //Check if file exists and add it, if not skip it
526       if (alienURL.Contains("AliESDs.root"))  
527       {
528         kTreeName  = "esdTree";
529         kInputData = "ESD";
530         alienURL.ReplaceAll("AliESDs.root","galice.root");
531         if(TFile::Open(alienURL)) kMC=kTRUE;
532         else kMC = kFALSE;
533         return;
534       }
535       else if(alienURL.Contains("AliAOD.root"))
536       {
537         kTreeName  = "aodTree";
538         kInputData = "AOD";
539         fAOD = TFile::Open(alienURL);
540         if(((TTree*) fAOD->Get("aodTree"))->GetBranch("mcparticles")) kMC=kTRUE;
541         else kMC = kFALSE;
542         return;
543       }
544       else if(alienURL.Contains("embededAOD.root"))
545       {
546         kTreeName  = "aodTree";
547         kInputData = "AOD";
548         kMC=kTRUE;
549         return;
550       }
551       else if(alienURL.Contains("galice.root"))
552       {
553         kTreeName  = "TE";
554         kInputData = "MC";
555         kMC=kTRUE;
556         return;
557       } 
558     }
559   }// xml analysis
560   //------------------------------
561   //PROOF files
562   //-----------------------------
563   else if(mode == mPROOF){
564     
565     TFileCollection* coll  = gProof->GetDataSet(kDatasetPROOF)->GetStagedSubset();
566     
567     TIter iter(coll->GetList());
568     
569     TFileInfo* fileInfo = 0;
570     while ((fileInfo = dynamic_cast<TFileInfo*> (iter())))
571     {
572       if (fileInfo->GetFirstUrl()) {
573         TString ProofURL = fileInfo->GetFirstUrl()->GetUrl();
574         cout << "================== " << ProofURL << endl ; 
575         
576         if     (ProofURL.Contains("pass1")) kPass = "pass1";
577         else if(ProofURL.Contains("pass2")) kPass = "pass2";
578         else if(ProofURL.Contains("pass3")) kPass = "pass3";
579         
580         kRun = AliAnalysisManager::GetRunFromAlienPath(ProofURL.Data());
581         printf("Run number from alien path = %d\n",kRun);
582         
583         TFile * fAOD = 0 ; 
584         //Check if file exists and add it, if not skip it
585         if (ProofURL.Contains("AliESDs.root"))  
586         {
587           kTreeName  = "esdTree";
588           kInputData = "ESD";
589           alienURL.ReplaceAll("AliESDs.root","galice.root");
590           if(TFile::Open(ProofURL)) kMC=kTRUE;
591           else kMC = kFALSE;
592           
593           return;
594         }
595         else if(ProofURL.Contains("AliAOD.root"))
596         {
597           kTreeName  = "aodTree";
598           kInputData = "AOD";
599           fAOD = TFile::Open(ProofURL);
600           if(((TTree*) fAOD->Get("aodTree"))->GetBranch("mcparticles")) kMC=kTRUE;
601           else kMC = kFALSE;
602           return;
603         }
604         else if(ProofURL.Contains("embededAOD.root"))
605         {
606           kTreeName  = "aodTree";
607           kInputData = "AOD";
608           kMC=kTRUE;
609           return;
610         }
611         else if(ProofURL.Contains("galice.root"))
612         {
613           kTreeName  = "TE";
614           kInputData = "MC";
615           kMC=kTRUE;
616           return;
617         } 
618       }
619     }
620   }// proof analysis
621   
622   gSystem->ChangeDirectory(ocwd.Data());
623   
624 }
625
626 //_____________________________________________________________________
627 void CreateChain(const anaModes mode, TChain * chain, TChain * chainxs)
628 {
629   //Fills chain with data
630   TString ocwd = gSystem->WorkingDirectory();
631   
632   //---------------------------------------
633   // Local files analysis
634   //---------------------------------------
635   if(mode == mLocal){    
636     //If you want to add several ESD files sitting in a common directory INDIR
637     //Specify as environmental variables the directory (INDIR), the number of files 
638     //to analyze (NFILES) and the pattern name of the directories with files (PATTERN)
639     
640     if(gSystem->Getenv("INDIR"))  
641       kInDir = gSystem->Getenv("INDIR") ; 
642     else cout<<"INDIR not set, use default: "<<kInDir<<endl;    
643     
644     if(gSystem->Getenv("PATTERN"))   
645       kPattern = gSystem->Getenv("PATTERN") ; 
646     else  cout<<"PATTERN not set, use default: "<<kPattern<<endl;
647     
648     if(gSystem->Getenv("NFILES"))
649       kFile = atoi(gSystem->Getenv("NFILES")) ;
650     else cout<<"NFILES not set, use default: "<<kFile<<endl;
651     
652     //Check if env variables are set and are correct
653     if ( kInDir  && kFile) {
654       printf("Get %d files from directory %s\n",kFile,kInDir);
655       if ( ! gSystem->cd(kInDir) ) {//check if ESDs directory exist
656         printf("%s does not exist\n", kInDir) ;
657         return ;
658       }
659       
660       //if(gSystem->Getenv("XSFILE"))  
661       //kXSFileName = gSystem->Getenv("XSFILE") ; 
662       //else cout<<" XS file name not set, use default: "<<kXSFileName<<endl;   
663       char * kGener = gSystem->Getenv("GENER");
664       if(kGener) {
665         cout<<"GENER "<<kGener<<endl;
666         if     (!strcmp(kGener,"PYTHIA")) kXSFileName = "pyxsec.root";
667         else if(!strcmp(kGener,"HERWIG")) kXSFileName = "hexsec.root";
668         else cout<<" UNKNOWN GENER, use default: "<<kXSFileName<<endl;
669       }
670       else cout<<" GENER not set, use default xs file name: "<<kXSFileName<<endl;
671       
672       cout<<"INDIR   : "<<kInDir     <<endl;
673       cout<<"NFILES  : "<<kFile      <<endl;
674       cout<<"PATTERN : "<<kPattern   <<endl;
675       cout<<"XSFILE  : "<<kXSFileName<<endl;
676       
677       TString datafile="";
678       if     (kInputData == "ESD")        datafile = "AliESDs.root" ;
679       else if(kInputData.Contains("AOD")) datafile = "AliAOD.root"  ;
680       else if(kInputData == "MC")         datafile = "galice.root"  ;
681       
682       //Loop on ESD/AOD/MC files, add them to chain
683       Int_t event =0;
684       Int_t skipped=0 ; 
685       char file[120] ;
686       char filexs[120] ;
687       
688       for (event = 0 ; event < kFile ; event++) {
689         sprintf(file,   "%s/%s%d/%s", kInDir,kPattern,event,datafile.Data()) ; 
690         sprintf(filexs, "%s/%s%d/%s", kInDir,kPattern,event,kXSFileName) ; 
691         TFile * fData = 0 ; 
692         //Check if file exists and add it, if not skip it
693         if ( fData = TFile::Open(file)) {
694           if ( fData->Get(kTreeName) ) { 
695             printf("++++ Adding %s\n", file) ;
696             chain->AddFile(file);
697             chainxs->Add(filexs) ; 
698           }
699         }
700         else { 
701           printf("---- Skipping %s\n", file) ;
702           skipped++ ;
703         }
704       }
705     }
706     else {
707       TString input = "AliESDs.root" ;
708       cout<<">>>>>> No list added, take a single file <<<<<<<<< "<<input<<endl;
709       chain->AddFile(input);
710     }
711     
712   }// local files analysis
713   
714   //------------------------------
715   // GRID xml files
716   //------------------------------
717   else if(mode == mGRID){
718     //Get colection file. It is specified by the environmental
719     //variable XML
720     
721     //Feed Grid with collection file
722     TGridCollection * collection = (TGridCollection*) TAlienCollection::Open(kXML);
723     if (! collection) {
724       AliError(Form("%s not found", kXML)) ; 
725       return kFALSE ; 
726     }
727     
728     TGridResult* result = collection->GetGridResult("",0 ,0);
729     
730     // Makes the ESD chain 
731     printf("*** Getting the Chain       ***\n");
732     for (Int_t index = 0; index < result->GetEntries(); index++) {
733       TString alienURL = result->GetKey(index, "turl") ; 
734       cout << "================== " << alienURL << endl ; 
735       chain->Add(alienURL) ; 
736       alienURL.ReplaceAll("AliESDs.root",kXSFileName);
737       chainxs->Add(alienURL) ; 
738     }
739   }// xml analysis
740   
741   //------------------------------
742   // PROOF
743   //------------------------------
744   else if (mode == mPROOF) {
745     
746     TFileCollection* ds= gProof->GetDataSet(kDatasetPROOF)->GetStagedSubset();
747     
748     gROOT->LoadMacro("/afs/in2p3.fr/group/alice/laf/dataset_management/CreateChainFromDataSet.C");
749     chain = CreateChainFromDataSet(ds, kTreeName , kDatasetNMaxFiles);
750     printf("chain has %d entries\n",chain->GetEntries());
751   }
752   
753   gSystem->ChangeDirectory(ocwd.Data());
754   
755 }
756
757 //______________________________
758 void CheckEnvironmentVariables()
759 {
760   
761   sprintf(kTrigger,"");
762   
763   Bool_t bRecalibrate = kFALSE;
764   Bool_t bBadChannel = kFALSE;
765   
766   for (int i=0; i< gApplication->Argc();i++){
767     
768 #ifdef VERBOSEARGS
769     
770     printf("Arg  %d:  %s\n",i,gApplication->Argv(i));
771     
772 #endif
773     
774     TString sRun = "";
775     
776     if (!(strcmp(gApplication->Argv(i),"--trigger")))
777       sprintf(trigger,gApplication->Argv(i+1));
778     
779     if (!(strcmp(gApplication->Argv(i),"--recalibrate")))
780       bRecalibrate = atoi(gApplication->Argv(i+1));
781     
782     if (!(strcmp(gApplication->Argv(i),"--badchannel")))
783       bBadChannel = atoi(gApplication->Argv(i+1));
784     
785     if (!(strcmp(gApplication->Argv(i),"--run"))){
786       sRun = gApplication->Argv(i+1);
787       if(sRun.Contains("LHC10")) {
788         kYear = 2010;
789       }
790       else {
791         if(kRun <=0){
792           kRun = atoi(gApplication->Argv(i+1));
793         }
794         else printf("** Run number already set  to %d, do not set to %d\n",kRun,atoi(gApplication->Argv(i+1)));
795       }//numeric run
796     }//--run available
797     
798   }// args loop
799   
800   if(!sRun.Contains("LHC10")){
801     if     ( kRun < 140000) 
802     {
803       kYear = 2010;
804       if( kRun >= 136851 ) kCollision = "PbPb";
805     }
806     else if( kRun < 170600)
807     {
808       kYear = 2011;
809       if( kRun >= 166500 ) kCollision = "PbPb";
810     }
811     else 
812     {
813       kYear = 2012;
814
815     }
816   }
817   
818   if(kMC) sprintf(kTrigger,"");
819   
820   printf("*********************************************\n");
821   //printf("*** Settings trigger %s, recalibrate %d, remove bad channels %d, year %d, collision %s, run %d ***\n",
822   //       kTrigger,bRecalibrate,bBadChannel, kYear,kCollision.Data(), kRun);
823   printf("*** Settings year %d, collision %s, run %d ***\n",kYear,kCollision.Data(), kRun);
824   printf("*********************************************\n");
825   
826 }
827
828
829 //_________________________________________________________________
830 void GetAverageXsection(TTree * tree, Double_t & xs, Float_t & ntr)
831 {
832   // Read the PYTHIA statistics from the file pyxsec.root created by
833   // the function WriteXsection():
834   // integrated cross section (xsection) and
835   // the  number of Pyevent() calls (ntrials)
836   // and calculate the weight per one event xsection/ntrials
837   // The spectrum calculated by a user should be
838   // multiplied by this weight, something like this:
839   // TH1F *userSpectrum ... // book and fill the spectrum
840   // userSpectrum->Scale(weight)
841   //
842   // Yuri Kharlov 19 June 2007
843   // Gustavo Conesa 15 April 2008
844   Double_t xsection = 0;
845   UInt_t    ntrials = 0;
846   xs = 0;
847   ntr = 0;
848   
849   Int_t nfiles =  tree->GetEntries()  ;
850   if (tree && nfiles > 0) {
851     tree->SetBranchAddress("xsection",&xsection);
852     tree->SetBranchAddress("ntrials" ,&ntrials );
853     for(Int_t i = 0; i < nfiles; i++){
854       tree->GetEntry(i);
855       xs  += xsection ;
856       ntr += ntrials ;
857       cout << "xsection " <<xsection<<" ntrials "<<ntrials<<endl; 
858     }
859     
860     xs =   xs /  nfiles;
861     ntr =  ntr / nfiles;
862     cout << "-----------------------------------------------------------------"<<endl;
863     cout << "Average of "<< nfiles<<" files: xsection " <<xs<<" ntrials "<<ntr<<endl; 
864     cout << "-----------------------------------------------------------------"<<endl;
865   } 
866   else cout << " >>>> Empty tree !!!! <<<<< "<<endl;
867   
868 }
869
870
871