provide info about structure of PWGGA code
[u/mrichter/AliRoot.git] / PWGGA / EMCALTasks / macros / anaCaloFilter.C
1 /* $Id:  $ */
2 //--------------------------------------------------
3 // Example macro to do Calorimeters filtering
4 // copy ESDs into AODs
5 //
6 // Pay attention to the options and definitions
7 // set in the lines below
8 //
9 //  Author : Gustavo Conesa Balbastre (INFN-LNF)
10 //
11 //-------------------------------------------------
12 enum anaModes {mLocal, mLocalCAF,mPROOF,mGRID};
13 //mLocal: Analyze locally files in your computer
14 //mLocalCAF: Analyze locally CAF files
15 //mPROOF: Analyze CAF files with PROOF
16
17 //---------------------------------------------------------------------------
18 //Settings to read locally several files, only for "mLocal" mode
19 //The different values are default, they can be set with environmental 
20 //variables: INDIR, PATTERN, NFILES, respectivelly
21 char * kInDir = "/user/data/files/"; 
22 char * kPattern = ""; // Data are in files kInDir/kPattern+i 
23 Int_t kFile = 1; // Number of files
24 //---------------------------------------------------------------------------
25 //Collection file for grid analysis
26 char * kXML = "collection.xml";
27 //---------------------------------------------------------------------------
28
29 const TString kInputData = "ESD"; //ESD, AOD, MC
30 TString kTreeName = "esdTree";
31 Bool_t kUsePhysSel = kTRUE;
32
33 void anaCaloFilter(Int_t mode=mLocal)
34 {
35   // Main
36   char cmd[200] ; 
37   sprintf(cmd, ".! rm -rf AliAOD.root") ; 
38   gROOT->ProcessLine(cmd) ; 
39   //--------------------------------------------------------------------
40   // Load analysis libraries
41   // Look at the method below, 
42   // change whatever you need for your analysis case
43   // ------------------------------------------------------------------
44   LoadLibraries(mode) ;
45   
46   //-------------------------------------------------------------------------------------------------
47   //Create chain from ESD and from cross sections files, look below for options.
48   //-------------------------------------------------------------------------------------------------
49   if(kInputData == "ESD") kTreeName = "esdTree" ;
50   else if(kInputData == "AOD") kTreeName = "aodTree" ;
51   else {
52     cout<<"Wrong  data type "<<kInputData<<endl;
53     break;
54   }
55   
56   TChain *chain       = new TChain(kTreeName) ;
57   CreateChain(mode, chain);  
58   
59   if(chain){
60     AliLog::SetGlobalLogLevel(AliLog::kError);//Minimum prints on screen
61     
62     //--------------------------------------
63     // Make the analysis manager
64     //-------------------------------------
65     AliAnalysisManager *mgr  = new AliAnalysisManager("Manager", "Manager");
66     
67     // AOD output handler
68     AliAODHandler* aodoutHandler   = new AliAODHandler();
69     aodoutHandler->SetOutputFileName("AliAOD.root");
70     ////aodoutHandler->SetCreateNonStandardAOD();
71     mgr->SetOutputEventHandler(aodoutHandler);
72     
73     //input
74     if(kInputData == "ESD")
75     {
76       // ESD handler
77       AliESDInputHandler *esdHandler = new AliESDInputHandler();
78       mgr->SetInputEventHandler(esdHandler);
79       esdHandler->SetReadFriends(kFALSE);
80       cout<<"ESD handler "<<mgr->GetInputEventHandler()<<endl;
81     }
82     if(kInputData == "AOD")
83     {
84       // AOD handler
85       AliAODInputHandler *aodHandler = new AliAODInputHandler();
86       mgr->SetInputEventHandler(aodHandler);
87       cout<<"AOD handler "<<mgr->GetInputEventHandler()<<endl;
88       
89     }
90     
91     // mgr->SetDebugLevel(1);
92     
93     //-------------------------------------------------------------------------
94     //Define task, put here any other task that you want to use.
95     //-------------------------------------------------------------------------    
96     // ESD physics selection task
97     if(kInputData == "ESD" && kUsePhysSel){
98       gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
99       AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection();
100     }
101     
102     //gROOT->LoadMacro("AddTaskCaloFilter.C");
103     //AliAnalysisTaskCaloFilter* filter = AddTaskCaloFilter();
104             
105     AliAnalysisTaskCaloFilter * filter = new AliAnalysisTaskCaloFilter();
106     filter->SetConfigFileName("ConfigCaloFilter.C");
107     mgr->AddTask(filter);
108       
109     // Create containers for input/output
110     AliAnalysisDataContainer *cinput1    = mgr->GetCommonInputContainer();
111     AliAnalysisDataContainer *coutput1   = mgr->GetCommonOutputContainer();
112     AliAnalysisDataContainer *coutntuple = mgr->CreateContainer("EventNtuple", TNtuple::Class(), 
113                                                                 AliAnalysisManager::kOutputContainer, "eventselection.root");
114     
115     mgr->ConnectInput  (filter, 0, cinput1);
116     mgr->ConnectOutput (filter, 0, coutput1 );
117     mgr->ConnectOutput (filter, 1, coutntuple );
118     
119     //-----------------------
120     // Run the analysis
121     //-----------------------    
122     TString smode = "";
123     if (mode==mLocal || mode == mLocalCAF) 
124       smode = "local";
125     else if (mode==mPROOF) 
126       smode = "proof";
127     else if (mode==mGRID) 
128       smode = "local";
129     
130     mgr->InitAnalysis();
131     mgr->PrintStatus();
132     mgr->StartAnalysis(smode.Data(),chain);
133     
134     cout <<" Analysis ended sucessfully "<< endl ;
135     
136   }
137   else cout << "Chain was not produced ! "<<endl;
138   
139   //sprintf(cmd, ".! rm -rf CorrectionFiles") ;
140   
141 }
142
143 void  LoadLibraries(const anaModes mode) {
144   
145   //--------------------------------------
146   // Load the needed libraries most of them already loaded by aliroot
147   //--------------------------------------
148   gSystem->Load("libTree.so");
149   gSystem->Load("libGeom.so");
150   gSystem->Load("libVMC.so");
151   gSystem->Load("libXMLIO.so");
152   gSystem->Load("libMatrix.so");
153   gSystem->Load("libPhysics.so");  
154
155   //----------------------------------------------------------
156   // >>>>>>>>>>> Local mode <<<<<<<<<<<<<< 
157   //----------------------------------------------------------
158   if (mode==mLocal || mode == mLocalCAF || mode == mGRID) {
159     //--------------------------------------------------------
160     // If you want to use already compiled libraries 
161     // in the aliroot distribution
162     //--------------------------------------------------------
163
164     gSystem->Load("libSTEERBase.so");
165     gSystem->Load("libESD.so");
166     gSystem->Load("libAOD.so");
167     gSystem->Load("libANALYSIS.so");
168     gSystem->Load("libANALYSISalice.so");
169     gSystem->Load("libANALYSISalice.so");
170     gSystem->Load("libCORRFW.so");
171     gSystem->Load("libPHOSUtils.so"); 
172     gSystem->Load("libEMCALUtils.so");
173     gSystem->Load("libPWG4CaloCalib.so");
174        
175     /*
176       //     gSystem->Load("libPWG4omega3pi.so");
177       //     gSystem->Load("libCORRFW.so");
178       //     gSystem->Load("libPWGCFbase.so");
179       //     gSystem->Load("libPWGmuon.so");
180  */
181     //--------------------------------------------------------
182     //If you want to use root and par files from aliroot
183     //--------------------------------------------------------  
184     /*     
185            SetupPar("STEERBase");
186            SetupPar("ESD");
187            SetupPar("AOD");
188            SetupPar("ANALYSIS");
189            SetupPar("ANALYSISalice");  
190            SetupPar("PHOSUtils");
191            SetupPar("EMCALUtils");
192            //Create Geometry
193            TGeoManager::Import("geometry.root") ; //need file "geometry.root" in local dir!!!!
194            SetupPar("PWG4CaloCalib");
195 */
196   }
197
198   //---------------------------------------------------------
199   // <<<<<<<<<< PROOF mode >>>>>>>>>>>>
200   //---------------------------------------------------------
201   else if (mode==mPROOF) {
202     //
203     // Connect to proof
204     // Put appropriate username here
205     // TProof::Reset("proof://mgheata@lxb6046.cern.ch"); 
206     TProof::Open("proof://mgheata@lxb6046.cern.ch");
207     
208     //    gProof->ClearPackages();
209     //    gProof->ClearPackage("ESD");
210     //    gProof->ClearPackage("AOD");
211     //    gProof->ClearPackage("ANALYSIS");   
212     //    gProof->ClearPackage("PWG4PartCorrBase");
213     //    gProof->ClearPackage("PWG4PartCorrDep");
214     
215     // Enable the STEERBase Package
216     gProof->UploadPackage("STEERBase.par");
217     gProof->EnablePackage("STEERBase");
218     // Enable the ESD Package
219     gProof->UploadPackage("ESD.par");
220     gProof->EnablePackage("ESD");
221     // Enable the AOD Package
222     gProof->UploadPackage("AOD.par");
223     gProof->EnablePackage("AOD");
224     // Enable the Analysis Package
225     gProof->UploadPackage("ANALYSIS.par");
226     gProof->EnablePackage("ANALYSIS");
227     // Enable the PHOS geometry Package
228     //gProof->UploadPackage("PHOSUtils.par");
229     //gProof->EnablePackage("PHOSUtils");
230     // Enable PartCorr analysis
231     gProof->UploadPackage("PWG4PartCorrBase.par");
232     gProof->EnablePackage("PWG4PartCorrBase");
233     gProof->UploadPackage("PWG4PartCorrDep.par");
234     gProof->EnablePackage("PWG4PartCorrDep");    
235     gProof->ShowEnabledPackages();
236   }  
237   
238 }
239
240 void SetupPar(char* pararchivename)
241 {
242   //Load par files, create analysis libraries
243   //For testing, if par file already decompressed and modified
244   //classes then do not decompress.
245  
246   TString cdir(Form("%s", gSystem->WorkingDirectory() )) ; 
247   TString parpar(Form("%s.par", pararchivename)) ; 
248   if ( gSystem->AccessPathName(parpar.Data()) ) {
249     gSystem->ChangeDirectory(gSystem->Getenv("ALICE_ROOT")) ;
250     TString processline(Form(".! make %s", parpar.Data())) ; 
251     gROOT->ProcessLine(processline.Data()) ;
252     gSystem->ChangeDirectory(cdir) ; 
253     processline = Form(".! mv $ALICE_ROOT/%s .", parpar.Data()) ;
254     gROOT->ProcessLine(processline.Data()) ;
255   } 
256   if ( gSystem->AccessPathName(pararchivename) ) {  
257     TString processline = Form(".! tar xvzf %s",parpar.Data()) ;
258     gROOT->ProcessLine(processline.Data());
259   }
260   
261   TString ocwd = gSystem->WorkingDirectory();
262   gSystem->ChangeDirectory(pararchivename);
263   
264   // check for BUILD.sh and execute
265   if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {
266     printf("*******************************\n");
267     printf("*** Building PAR archive    ***\n");
268     cout<<pararchivename<<endl;
269     printf("*******************************\n");
270     
271     if (gSystem->Exec("PROOF-INF/BUILD.sh")) {
272       Error("runProcess","Cannot Build the PAR Archive! - Abort!");
273       return -1;
274     }
275   }
276   // check for SETUP.C and execute
277   if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {
278     printf("*******************************\n");
279     printf("*** Setup PAR archive       ***\n");
280     cout<<pararchivename<<endl;
281     printf("*******************************\n");
282     gROOT->Macro("PROOF-INF/SETUP.C");
283   }
284   
285   gSystem->ChangeDirectory(ocwd.Data());
286   printf("Current dir: %s\n", ocwd.Data());
287 }
288
289
290
291 void CreateChain(const anaModes mode, TChain * chain){
292   //Fills chain with data
293   TString ocwd = gSystem->WorkingDirectory();
294   
295   //-----------------------------------------------------------
296   //Analysis of CAF data locally and with PROOF
297   //-----------------------------------------------------------
298   if(mode ==mPROOF || mode ==mLocalCAF){
299     // Chain from CAF
300     gROOT->LoadMacro("$ALICE_ROOT/PWG0/CreateESDChain.C");
301     // The second parameter is the number of input files in the chain
302     chain = CreateESDChain("ESD12001.txt", 5);  
303   }
304   
305   //---------------------------------------
306   //Local files analysis
307   //---------------------------------------
308   else if(mode == mLocal){    
309     //If you want to add several ESD files sitting in a common directory INDIR
310     //Specify as environmental variables the directory (INDIR), the number of files 
311     //to analyze (NFILES) and the pattern name of the directories with files (PATTERN)
312
313     if(gSystem->Getenv("INDIR"))  
314       kInDir = gSystem->Getenv("INDIR") ; 
315     else cout<<"INDIR not set, use default: "<<kInDir<<endl;    
316     
317     if(gSystem->Getenv("PATTERN"))   
318       kPattern = gSystem->Getenv("PATTERN") ; 
319     else  cout<<"PATTERN not set, use default: "<<kPattern<<endl;
320     
321     if(gSystem->Getenv("NFILES"))
322       kFile = atoi(gSystem->Getenv("NFILES")) ;
323     else cout<<"NFILES not set, use default: "<<kFile<<endl;
324     
325     //Check if env variables are set and are correct
326     if ( kInDir  && kFile) {
327       printf("Get %d files from directory %s\n",kFile,kInDir);
328       if ( ! gSystem->cd(kInDir) ) {//check if ESDs directory exist
329         printf("%s does not exist\n", kInDir) ;
330         return ;
331       }
332
333   
334       cout<<"INDIR   : "<<kInDir<<endl;
335       cout<<"NFILES  : "<<kFile<<endl;
336       cout<<"PATTERN : " <<kPattern<<endl;
337
338       TString datafile="";
339       if(kInputData == "ESD") datafile = "AliESDs.root" ;
340       else if(kInputData == "AOD") datafile = "AliAOD.root" ;
341       else if(kInputData == "MC")  datafile = "galice.root" ;
342       
343       //Loop on ESD files, add them to chain
344       Int_t event =0;
345       Int_t skipped=0 ; 
346       char file[120] ;
347       
348       for (event = 0 ; event < kFile ; event++) {
349         sprintf(file, "%s/%s%d/%s", kInDir,kPattern,event,datafile.Data()) ; 
350         TFile * fESD = 0 ; 
351         //Check if file exists and add it, if not skip it
352         if ( fESD = TFile::Open(file)) {
353           if ( fESD->Get(kTreeName) ) { 
354             printf("++++ Adding %s\n", file) ;
355             chain->AddFile(file);
356           }
357         }
358         else { 
359           printf("---- Skipping %s\n", file) ;
360           skipped++ ;
361         }
362       }
363       printf("number of entries # %lld, skipped %d\n", chain->GetEntries(), skipped*100) ;      
364     }
365     else {
366       TString input = "AliESDs.root" ;
367       cout<<">>>>>> No list added, take a single file <<<<<<<<< "<<input<<endl;
368       chain->AddFile(input);
369     }
370     
371   }// local files analysis
372   
373   //------------------------------
374   //GRID xml files
375   //-----------------------------
376   else if(mode == mGRID){
377     //Get colection file. It is specified by the environmental
378     //variable XML
379
380     if(gSystem->Getenv("XML") )
381       kXML = gSystem->Getenv("XML");
382     else
383       sprintf(kXML, "collection.xml") ; 
384     
385     if (!TFile::Open(kXML)) {
386       printf("No collection file with name -- %s -- was found\n",kXML);
387       return ;
388     }
389     else cout<<"XML file "<<kXML<<endl;
390
391     //Load necessary libraries and connect to the GRID
392     gSystem->Load("libNetx.so") ; 
393     gSystem->Load("libRAliEn.so"); 
394     TGrid::Connect("alien://") ;
395
396     //Feed Grid with collection file
397     //TGridCollection * collection =  (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\", 0)", kXML));
398     TGridCollection * collection = (TGridCollection*) TAlienCollection::Open(kXML);
399     if (! collection) {
400       AliError(Form("%s not found", kXML)) ; 
401       return kFALSE ; 
402     }
403     TGridResult* result = collection->GetGridResult("",0 ,0);
404    
405     // Makes the ESD chain 
406     printf("*** Getting the Chain       ***\n");
407     for (Int_t index = 0; index < result->GetEntries(); index++) {
408       TString alienURL = result->GetKey(index, "turl") ; 
409       cout << "================== " << alienURL << endl ; 
410       chain->Add(alienURL) ; 
411     }
412   }// xml analysis
413   
414   gSystem->ChangeDirectory(ocwd.Data());
415 }
416