4db41417498bfeb2cada8042580bd6cf74f758f8
[u/mrichter/AliRoot.git] / PWGGA / CaloTrackCorrelations / macros / AddTaskIsoPhoton.C
1 // Configuration macro for analysis of isolated photon spectra
2 // Author : Gustavo Conesa;  Marie Germain.
3
4 TString kAnaIsoPhotonName = "";
5 AliAnalysisTaskCaloTrackCorrelation *AddTaskIsoPhoton(const Float_t  cone          = 0.4,
6                                                       const Float_t  pth           = 5.,
7                                                       const Bool_t   timecut       = kFALSE,
8                                                       const TString  calorimeter   = "EMCAL",
9                                                       const Bool_t   simu          = kFALSE,
10                                                       const Bool_t   exotic        = kTRUE,
11                                                       const Bool_t   nonlin        = kFALSE,
12                                                       const TString  trigger       = "EMC7",
13                                                       const Bool_t   tm            = kTRUE,
14                                                       const Int_t    minCen        = -1,
15                                                       const Int_t    maxCen        = -1,
16                                                       const Int_t    nlmMax        =  2,
17                                                       const Bool_t   qaan          = kFALSE,
18                                                       const Int_t    debug         = -1,
19                                                       const Bool_t   print         = kFALSE
20                                                       )
21 {
22   // Creates a CaloTrackCorr task, configures it and adds it to the analysis manager.
23   
24   printf("AddTaskIsoPhoton() - Settings: cone %2.2f, pth %2.2f, timeCut On %d, NLM max cut %d, calorimeter %s, simu %d, exotic %d, non lin %d, trigger %s, TM %d, qa %d, debug %d, centrality %d-%d\n",
25                                          cone,    pth,    timecut   ,    nlmMax,      calorimeter.Data(),simu, exotic,    nonlin,     trigger.Data(), tm,    qaan,   debug, minCen, maxCen );
26   
27   // Get the pointer to the existing analysis manager via the static access method.
28   
29   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
30   if (!mgr) 
31   {
32     ::Error("AddTask", "No analysis manager to connect to.");
33     return NULL;
34   }  
35   
36   // Check the analysis type using the event handlers connected to the analysis manager.
37   
38   if (!mgr->GetInputEventHandler()) 
39   {
40     ::Error("AddTask", "This task requires an input event handler");
41     return NULL;
42   }
43
44   Bool_t useKinematics = kFALSE;
45   useKinematics = (mgr->GetMCtruthEventHandler())?kTRUE:kFALSE;
46
47   // Name for containers
48   
49   kAnaIsoPhotonName = Form("%s_Trig%s_TM%d_R%1.1f_Pt%1.1f",calorimeter.Data(), trigger.Data(),tm,cone,pth);
50
51   if(maxCen>=0) kAnaIsoPhotonName+=Form("Cen%d_%d",minCen,maxCen);
52     
53   printf("<<<< NAME: %s >>>>>\n",kAnaIsoPhotonName.Data());
54   
55   // #### Configure analysis ####
56     
57   AliAnaCaloTrackCorrMaker * maker = new AliAnaCaloTrackCorrMaker();
58   
59   //maker->SetScaleFactor(scaleFactor); // for MC, negative (not scaled) by default
60   
61   // General frame setting and configuration
62   maker->SetReader   (ConfigureReader   (mgr->GetInputEventHandler()->GetDataType(),useKinematics,simu,
63                                          calorimeter,nonlin, timecut,minCen, maxCen, debug,print));
64   maker->SetCaloUtils(ConfigureCaloUtils(nonlin,exotic,simu,timecut,debug,print));
65   
66   // Analysis tasks setting and configuration
67   Int_t n = 0;//Analysis number, order is important
68
69   // Isolation settings
70   Int_t partInCone = AliIsolationCut::kNeutralAndCharged; // kOnlyCharged;
71   //  Int_t thresType  = AliIsolationCut::kPtThresIC;//  AliIsolationCut::kSumPtFracIC ; 
72   Int_t thresType  = AliIsolationCut::kSumPtIC ; 
73   
74   // Photon analysis
75   maker->AddAnalysis(ConfigurePhotonAnalysis(calorimeter,tm,nlmMax,simu,debug,print), n++); // Photon cluster selection
76   
77   // Isolation analysis
78   maker->AddAnalysis(ConfigureIsolationAnalysis(calorimeter,"Photon", partInCone,thresType,cone, pth,tm,kFALSE,simu,debug,print), n++); // Photon isolation
79
80   // QA histograms on clusters or tracks
81   if(qaan)
82   {
83     maker->AddAnalysis(ConfigureQAAnalysis(calorimeter,simu,debug,print),n++);
84     maker->AddAnalysis(ConfigureChargedAnalysis(simu,debug), n++); // charged tracks plots
85   }
86   
87   maker->SetAnaDebug(debug)  ;
88   maker->SwitchOnHistogramsMaker()  ;
89   maker->SwitchOnAODsMaker()  ;
90   
91   if(print) maker->Print("");
92   
93   maker->SwitchOffDataControlHistograms();
94   
95   printf("<< End Configuration of %d analysis for calorimeter %s >>\n",n, calorimeter.Data());
96  
97   // Create task
98   
99   AliAnalysisTaskCaloTrackCorrelation * task = new AliAnalysisTaskCaloTrackCorrelation (Form("CaloTrackCorr%s",kAnaIsoPhotonName.Data()));
100   task->SetConfigFileName(""); //Don't configure the analysis via configuration file.
101   task->SetDebugLevel(debug);
102   task->SetBranches("ESD:AliESDRun.,AliESDHeader"); 
103   task->SetAnalysisMaker(maker);
104   mgr->AddTask(task);
105   
106   //Create containers
107   
108   TString outputfile = AliAnalysisManager::GetCommonFileName();
109   
110   AliAnalysisDataContainer *cout_pc   = mgr->CreateContainer(kAnaIsoPhotonName, TList::Class(), 
111                                                              AliAnalysisManager::kOutputContainer, 
112                                                              Form("%s",outputfile.Data()));
113         
114   AliAnalysisDataContainer *cout_cuts = mgr->CreateContainer(Form("Param_%s",kAnaIsoPhotonName.Data()), TList::Class(), 
115                                                              AliAnalysisManager::kParamContainer, 
116                                                              "AnalysisParameters.root");
117   
118   // Create ONLY the output containers for the data produced by the task.
119   // Get and connect other common input/output containers via the manager as below
120   //==============================================================================
121   mgr->ConnectInput  (task, 0, mgr->GetCommonInputContainer());
122   // AOD output slot will be used in a different way in future
123   mgr->ConnectOutput (task, 1, cout_pc);
124   mgr->ConnectOutput (task, 2, cout_cuts);
125
126   // Set the trigger selection
127   UInt_t mask =  SetTriggerMaskFromName(trigger);
128   task->SelectCollisionCandidates(mask);
129   
130   return task;
131 }
132
133 //____________________________________
134 AliCaloTrackReader * ConfigureReader(TString inputDataType = "AOD", Bool_t useKinematics = kFALSE, Bool_t simu = kFALSE,
135                                      TString calorimeter = "EMCAL", Bool_t nonlin = kTRUE, Bool_t timecut = kFALSE,
136                                      Float_t minCen = -1, Float_t maxCen = -1,
137                                      Int_t debug = -1, Bool_t print = kFALSE)
138 {
139   // Init reader settings: event selection, basic cluster track cuts, etc
140   
141   if(simu)
142   {
143     if (!useKinematics && inputDataType=="AOD") useKinematics = kTRUE; //AOD primary should be available ...
144   }
145   
146   cout<<"********* ACCESS KINE? "<<useKinematics<< endl;
147
148   AliCaloTrackReader * reader = 0;
149   if     (inputDataType=="AOD") reader = new AliCaloTrackAODReader();
150   else if(inputDataType=="ESD") reader = new AliCaloTrackESDReader();
151   else  printf("AliCaloTrackReader::ConfigureReader() - Data not known inputData=%s\n",inputDataType.Data());
152   
153   reader->SetDebug(debug);//10 for lots of messages
154   
155   reader->SwitchOffTriggerPatchMatching();
156   reader->SwitchOffBadTriggerEventsRemoval();
157   
158   reader->SwitchOffWriteDeltaAOD()  ;
159   
160   // MC settings
161   if(useKinematics)
162   {
163     if(inputDataType == "ESD")
164     {
165       reader->SwitchOnStack();          
166       reader->SwitchOffAODMCParticles(); 
167     }
168     else if(inputDataType == "AOD")
169     {
170       reader->SwitchOffStack();          
171       reader->SwitchOnAODMCParticles(); 
172     }
173   }  
174   
175   //------------------------
176   // Detector input filling
177   //------------------------
178   
179   //Min cluster/track E
180   reader->SetEMCALEMin(0.3); 
181   reader->SetEMCALEMax(1000); 
182   reader->SetPHOSEMin(0.3);
183   reader->SetPHOSEMax(1000);
184   reader->SetCTSPtMin(0.2);
185   reader->SetCTSPtMax(1000);
186
187   // Time cuts
188   if(simu)
189   {
190     reader->SwitchOffUseTrackTimeCut();
191     reader->SwitchOffUseParametrizedTimeCut();
192     reader->SwitchOffUseEMCALTimeCut();
193     reader->SetEMCALTimeCut(-1e10,1e10); // Open time cut
194   }
195   else
196   {
197     reader->SwitchOffUseParametrizedTimeCut();
198
199     if(timecut)
200     {
201       printf("Set time cut \n");
202       reader->SwitchOnUseEMCALTimeCut();
203       //Absolute window
204       reader->SetEMCALTimeCut(-30.,30.); // default is -25ns-20ns
205     }
206     else
207     {
208       printf("Off time cuts time cut \n");
209       reader->SwitchOffUseEMCALTimeCut();
210       //Absolute window
211       reader->SetEMCALTimeCut(-1.e6,1.e6);
212     }
213   }
214   
215   reader->SwitchOffFiducialCut();
216   reader->GetFiducialCut()->SetSimpleCTSFiducialCut(0.8, 0, 360) ;
217
218   // Tracks
219   reader->SwitchOnCTS();
220
221   reader->SwitchOffRecalculateVertexBC();
222   reader->SwitchOffVertexBCEventSelection();
223   
224   reader->SwitchOffUseTrackTimeCut();
225   reader->SetTrackTimeCut(0,50);
226   
227   reader->SwitchOffUseTrackDCACut();
228   //reader->SetTrackDCACut(0,0.0105);
229   //reader->SetTrackDCACut(1,0.035);
230   //reader->SetTrackDCACut(2,1.1);
231   
232   if(inputDataType=="ESD")
233   {
234     gROOT->LoadMacro("$ALICE_ROOT/PWGJE/macros/CreateTrackCutsPWGJE.C");
235     //AliESDtrackCuts * esdTrackCuts = CreateTrackCutsPWGJE(10041004);
236     //reader->SetTrackCuts(esdTrackCuts);
237     //reader->SwitchOnConstrainTrackToVertex();
238     
239 //    if(kYears>2010)
240     {
241       //Hybrids 2011
242       AliESDtrackCuts * esdTrackCuts  = CreateTrackCutsPWGJE(10001008);
243       reader->SetTrackCuts(esdTrackCuts);
244       AliESDtrackCuts * esdTrackCuts2 = CreateTrackCutsPWGJE(10011008);
245       reader->SetTrackComplementaryCuts(esdTrackCuts2);
246     }
247 //    else
248 //    {
249 //      //Hybrids 2010
250 //      AliESDtrackCuts * esdTrackCuts  = CreateTrackCutsPWGJE(10001006);
251 //      reader->SetTrackCuts(esdTrackCuts);
252 //      AliESDtrackCuts * esdTrackCuts2 = CreateTrackCutsPWGJE(10041006);
253 //      reader->SetTrackComplementaryCuts(esdTrackCuts2);
254 //    }
255   }
256   else if(inputDataType=="AOD")
257   {
258     //reader->SetTrackFilterMask(128);           // Filter bit, not mask, use if off hybrid
259     reader->SwitchOnAODHybridTrackSelection(); // Check that the AODs have Hybrids!!!!
260     reader->SetTrackStatus(AliVTrack::kITSrefit);
261     //reader->SwitchOnTrackHitSPDSelection();    // Check that the track has at least a hit on the SPD, not much sense to use for hybrid or TPC only tracks
262   }
263   
264   // Calorimeter
265   
266   reader->SwitchOffClusterRecalculation();
267   
268   
269   // CAREFUL
270   if(!nonlin) reader->SwitchOffClusterELinearityCorrection();
271   else        reader->SwitchOnClusterELinearityCorrection();
272   
273   if(calorimeter == "EMCAL") {
274     reader->SwitchOnEMCALCells();
275     reader->SwitchOnEMCAL();
276   }
277   if(calorimeter == "PHOS") { // Should be on if QA is activated with correlation on
278     reader->SwitchOffPHOSCells();
279     reader->SwitchOffPHOS();
280   }
281   
282   //-----------------
283   // Event selection
284   //-----------------
285   
286   //if(!kUseKinematics) reader->SetFiredTriggerClassName("CEMC7EGA-B-NOPF-CENTNOTRD"); // L1 Gamma
287   
288   // reader->RejectFastClusterEvents() ;
289   
290   reader->SwitchOnEventTriggerAtSE();
291   
292   reader->SetZvertexCut(10.);               // Open cut
293   reader->SwitchOnPrimaryVertexSelection(); // and besides primary vertex
294   reader->SwitchOnRejectNoTrackEvents();
295  
296   reader->SwitchOffPileUpEventRejection();   // remove pileup
297   reader->SwitchOffV0ANDSelection() ;        // and besides v0 AND
298
299   if(maxCen > 0 )
300   {
301     // Centrality
302     reader->SetCentralityClass("V0M");
303     reader->SetCentralityOpt(100);  // 10 (c= 0-10, 10-20 ...), 20  (c= 0-5, 5-10 ...) or 100 (c= 1, 2, 3 ..)
304     reader->SetCentralityBin(minCen,maxCen); // Accept all events, if not select range
305     
306     // Event plane (only used in Maker and mixing for AliAnaPi0/AliAnaHadronCorrelation for the moment)
307     reader->SetEventPlaneMethod("V0");
308   }
309   
310   if(print) reader->Print("");
311   
312   return reader;
313     
314 }
315
316 //_______________________________________
317 AliCalorimeterUtils* ConfigureCaloUtils(Bool_t nonlin = kTRUE, Bool_t exotic = kTRUE ,Bool_t simu = kFALSE, Bool_t timecut = kFALSE, Int_t debug = -1, Bool_t print = kFALSE)
318 {
319   
320   AliCalorimeterUtils *cu = new AliCalorimeterUtils;
321   cu->SetDebug(debug);
322   
323   // Remove clusters close to borders, at least max energy cell is 1 cell away 
324   cu->SetNumberOfCellsFromEMCALBorder(1);
325   cu->SetNumberOfCellsFromPHOSBorder(2);
326   
327   cu->SwitchOffRecalculateClusterTrackMatching();
328   
329   cu->SwitchOffBadChannelsRemoval() ;
330   
331   //EMCAL settings
332
333   if(simu)
334     cu->SwitchOnLoadOwnEMCALGeometryMatrices();
335   
336   AliEMCALRecoUtils * recou = cu->GetEMCALRecoUtils();
337   
338   cu->SwitchOffRecalibration();
339   cu->SwitchOffRunDepCorrection();
340   
341   gROOT->LoadMacro("$ALICE_ROOT/PWGGA/EMCALTasks/macros/ConfigureEMCALRecoUtils.C");
342   ConfigureEMCALRecoUtils(recou,
343                           simu,
344                           exotic,
345                           nonlin,
346                           kFALSE, // e calib
347                           kFALSE, // bad map
348                           kFALSE); // time calib
349   if(timecut) recou->SetExoticCellDiffTimeCut(50.);
350
351   if( nonlin)
352   { 
353     printf("ConfigureCaloUtils() - Apply non linearity to EMCAL\n");
354     cu->SwitchOnCorrectClusterLinearity();
355   }
356     
357   printf("ConfigureCaloUtils() - EMCAL Recalibration ON? %d %d\n",recou->IsRecalibrationOn(), cu->IsRecalibrationOn());
358   printf("ConfigureCaloUtils() - EMCAL BadMap        ON? %d %d\n",recou->IsBadChannelsRemovalSwitchedOn(), cu->IsBadChannelsRemovalSwitchedOn());
359   
360   cu->SetNumberOfSuperModulesUsed(10);
361
362   if(print) cu->Print("");
363   
364   return cu;
365   
366 }
367
368 //_____________________________________
369 AliAnaPhoton* ConfigurePhotonAnalysis(TString calorimeter = "EMCAL", Bool_t tm = kFALSE, Int_t nlmMax = 2, Bool_t simu = kFALSE, Int_t debug = -1, Bool_t print = kFALSE)
370 {
371   
372   AliAnaPhoton *ana = new AliAnaPhoton();
373   ana->SetDebug(debug); //10 for lots of messages
374   
375   // cluster selection cuts
376   
377   ana->SwitchOffFiducialCut();
378
379   ana->SetCalorimeter(calorimeter);
380   
381   if(calorimeter == "PHOS")
382   {
383     ana->SetNCellCut(2);// At least 3 cells
384     ana->SetMinPt(0.3);
385     ana->SetMinDistanceToBadChannel(2, 4, 5);
386     ana->SetTimeCut(-1e10,1e10); // open cut
387   }
388   else 
389   {//EMCAL
390     ana->SetNCellCut(1);// At least 2 cells
391     ana->SetMinEnergy(0.3); // avoid mip peak at E = 260 MeV
392     ana->SetMaxEnergy(1000); 
393     //    ana->SetTimeCut(-1e10,1e10); // open cut, usual time window of [425-825] ns if time recalibration is off 
394     // restrict to less than 100 ns when time calibration is on 
395     ana->SetMinDistanceToBadChannel(2, 4, 6); 
396     
397     // NLM cut, used in all, exclude clusters with more than 2 maxima
398     // Not needed if M02 cut is already strong or clusterizer V2
399     ana->SetNLMCut(1, nlmMax) ;
400   }
401   
402   if(tm)
403   {
404     ana->SwitchOnTrackMatchRejection() ;
405     ana->SwitchOffTMHistoFill() ;
406   }
407   else
408   {
409     ana->SwitchOffTrackMatchRejection() ;
410     ana->SwitchOnTMHistoFill() ;
411   }
412   
413   //PID cuts (shower shape)
414   ana->SwitchOnCaloPID(); // do PID selection, unless specified in GetCaloPID, selection not based on bayesian
415   AliCaloPID* caloPID = ana->GetCaloPID();
416   //Not used in bayesian
417   
418   //EMCAL
419   caloPID->SetEMCALLambda0CutMax(10.);
420   caloPID->SetEMCALLambda0CutMin(0.10);
421   
422   caloPID->SetEMCALDEtaCut(0.025);
423   caloPID->SetEMCALDPhiCut(0.030);
424
425   ana->SwitchOnFillShowerShapeHistograms();  // Filled before photon shower shape selection
426   if(!simu) ana->SwitchOnFillPileUpHistograms();
427
428   // Input / output delta AOD settings
429   
430   ana->SetOutputAODName(Form("Photon%s",kAnaIsoPhotonName.Data()));
431   ana->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
432   
433   //Set Histograms name tag, bins and ranges
434   
435   ana->AddToHistogramsName(Form("AnaPhoton_TM%d_",tm));
436   SetHistoRangeAndNBins(ana->GetHistogramRanges(), calorimeter); // see method below
437   
438   // Number of particle type MC histograms
439   ana->FillNOriginHistograms(20);
440   ana->FillNPrimaryHistograms(20);
441   
442   ConfigureMC(ana,simu);
443   
444   if(print) ana->Print("");
445   
446   return ana;
447   
448 }
449
450 //____________________________________________________________________________________________________
451 AliAnaParticleIsolation* ConfigureIsolationAnalysis(TString calorimeter = "EMCAL", TString particle="Photon",
452                                                     Int_t  partInCone = AliIsolationCut::kOnlyCharged,
453                                                     Int_t  thresType  = AliIsolationCut::kSumPtFracIC,
454                                                     Float_t cone = 0.3,
455                                                     Float_t pth  = 0.3,
456                                                     Bool_t tm = kFALSE,
457                                                     Bool_t multi = kFALSE, Bool_t simu = kFALSE,
458                                                     Int_t debug = -1, Bool_t print = kFALSE)
459 {
460   
461   AliAnaParticleIsolation *ana = new AliAnaParticleIsolation();
462   ana->SetDebug(debug);
463   
464   ana->SwitchOnFiducialCut();
465   //Avoid borders of EMCal
466   if(calorimeter=="EMCAL")
467   {
468     //ana->GetFiducialCut()->SetSimpleEMCALFiducialCut(0.6, 86, 174) ;
469     ana->GetFiducialCut()->SetSimpleEMCALFiducialCut(0.27, 103, 157) ;
470   }
471   
472   ana->SetMinPt(5);
473   
474   // Input / output delta AOD settings
475   
476   ana->SetInputAODName(Form("%s%s",particle.Data(),kAnaIsoPhotonName.Data()));
477   ana->SetAODObjArrayName(Form("IC%s_%s",particle.Data(),kAnaIsoPhotonName.Data())); 
478   
479   ana->SetCalorimeter(calorimeter);
480   
481   if(!tm)  ana->SwitchOnTMHistoFill();
482   else     ana->SwitchOffTMHistoFill();
483   //   ana->SwitchOnTMHistoFill();
484  
485   // ana->SwitchOffSSHistoFill();
486   // if(!kSimulation) ana->SwitchOnFillPileUpHistograms();
487    ana->SwitchOnSSHistoFill();
488   if(!simu) ana->SwitchOnFillPileUpHistograms();
489
490   //Do settings for main isolation cut class
491   AliIsolationCut * ic =  ana->GetIsolationCut();       
492   ic->SetDebug(debug);
493   
494   printf("\t *** Set: R = %2.2f, Threshold %2.2f, Method %d, Neutral/Charged option %d ***\n",cone,pth,thresType,partInCone);
495   
496   ic->SetPtThreshold(pth);
497   ic->SetConeSize(cone);
498   
499   ic->SetPtFraction(0.1);
500   //  ic->SetSumPtThreshold(1.0) ;
501   ic->SetPtThreshold(pth);
502   ic->SetSumPtThreshold(pth);
503   ic->SetParticleTypeInCone(partInCone);
504   ic->SetICMethod(thresType);
505   
506   //Do or not do isolation with previously produced AODs.
507   //No effect if use of SwitchOnSeveralIsolation()
508   ana->SwitchOffReIsolation();
509   
510   //Multiple IC
511   if(multi) 
512   {
513     ic->SetConeSize(1.);    // Take all for first iteration
514     ic->SetPtThreshold(100);// Take all for first iteration
515     ana->SwitchOnSeveralIsolation() ;
516     ana->SetAODObjArrayName(Form("MultiIC%sTM%d",particle.Data(),tm));
517      
518     ana->SetNCones(4);
519     ana->SetNPtThresFrac(4);
520     ana->SetConeSizes(0,0.3);       ana->SetConeSizes(1,0.4);
521     ana->SetConeSizes(2,0.5);       ana->SetConeSizes(3,0.6);
522     ana->SetPtThresholds(0, 0.5);   ana->SetPtThresholds(1, 1);     ana->SetPtThresholds(2, 2);
523     ana->SetPtFractions (0, 0.05) ; ana->SetPtFractions (1, 0.1);   ana->SetPtFractions (2, 0.2) ;  ana->SetPtFractions (3, 0.3) ;
524     ana->SetSumPtThresholds(0, 1) ; ana->SetSumPtThresholds(1, 3) ; ana->SetSumPtThresholds(2, 5);  ana->SetSumPtThresholds(3, 7)  ;
525     
526     ana->SwitchOffTMHistoFill();
527     ana->SwitchOffSSHistoFill();
528   }
529   else      
530     ana->SwitchOffSeveralIsolation() ;
531   
532   AliCaloPID* caloPID = ana->GetCaloPID();
533   caloPID->SetEMCALDEtaCut(0.02);
534   caloPID->SetEMCALDPhiCut(0.030);
535   
536   //Set Histograms name tag, bins and ranges
537   
538   if(!multi)ana->AddToHistogramsName(Form("AnaIsol%s_TM%d_",particle.Data(),tm));
539   else      ana->AddToHistogramsName(Form("AnaMultiIsol%s_TM%d_",particle.Data(),tm));
540
541   SetHistoRangeAndNBins(ana->GetHistogramRanges(),calorimeter); // see method below
542   
543   ana->SetHistoPtInConeRangeAndNBins(0, 50 , 250);
544   ana->SetHistoPtSumRangeAndNBins   (0, 100, 250);
545   
546   if(particle=="Hadron"  || particle.Contains("CTS"))
547   {
548     ana->GetHistogramRanges()->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 200) ;
549     ana->GetHistogramRanges()->SetHistoEtaRangeAndNBins(-1.5, 1.5, 300) ;
550   }
551   
552   ConfigureMC(ana,simu);
553   
554   if(print) ic ->Print("");
555   if(print) ana->Print("");
556   
557   return ana;
558   
559 }
560
561
562 //________________________________________
563 AliAnaCalorimeterQA* ConfigureQAAnalysis(TString calorimeter = "EMCAL", Bool_t simu = kFALSE, Int_t debug = -1, Bool_t print = kFALSE)
564 {
565   
566   AliAnaCalorimeterQA *ana = new AliAnaCalorimeterQA();
567   ana->SetDebug(debug); //10 for lots of messages
568   ana->SetCalorimeter(calorimeter);
569   
570   ana->SetTimeCut(-1e10,1e10); // Open time cut
571   ana->SwitchOffCorrelation();
572   
573   // Study exotic clusters PHOS and EMCAL
574   ana->SwitchOffStudyBadClusters() ;
575   
576   
577   ana->SwitchOffFiducialCut();
578   ana->SwitchOffFillAllTH3Histogram();
579   ana->SwitchOffFillAllPositionHistogram();
580   ana->SwitchOffFillAllPositionHistogram2();
581   ana->SwitchOffStudyBadClusters();
582   ana->SwitchOffStudyClustersAsymmetry();
583   ana->SwitchOffStudyWeight();
584   ana->SwitchOnFillAllTrackMatchingHistogram();
585   ana->SwitchOnFillAllCellTimeHisto() ;
586
587   
588   ana->AddToHistogramsName("QA_"); //Begining of histograms name
589   SetHistoRangeAndNBins(ana->GetHistogramRanges(),calorimeter); // see method below
590   
591   ConfigureMC(ana,simu);
592   
593   if(print) ana->Print("");
594   
595   return ana;
596   
597 }
598
599 //___________________________________________________________________________________
600 AliAnaChargedParticles* ConfigureChargedAnalysis(Bool_t simulation, Int_t debugLevel)
601 {
602   
603   AliAnaChargedParticles *ana = new AliAnaChargedParticles();
604   ana->SetDebug(debugLevel); //10 for lots of messages
605   
606   // selection cuts
607   
608   ana->SetMinPt(0.5);
609   ana->SwitchOnFiducialCut();
610   ana->GetFiducialCut()->SetSimpleCTSFiducialCut(0.8, 0, 360) ; //more restrictive cut in reader and after in isolation
611   
612   ana->SwitchOffFillVertexBC0Histograms() ;
613   //if(!simulation) ana->SwitchOnFillPileUpHistograms();
614   
615   // Input / output delta AOD settings
616   
617   ana->SetOutputAODName(Form("Hadron%s",kAnaIsoPhotonName.Data()));
618   ana->SetOutputAODClassName("AliAODPWG4Particle");
619   ana->SetInputAODName(Form("Hadron%s",kAnaIsoPhotonName.Data()));
620   
621   //Set Histograms name tag, bins and ranges
622   
623   ana->AddToHistogramsName("AnaHadrons_");
624   SetHistoRangeAndNBins(ana->GetHistogramRanges(),""); // see method below
625   
626   ana->GetHistogramRanges()->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 200) ;
627   ana->GetHistogramRanges()->SetHistoEtaRangeAndNBins(-1.5, 1.5, 300) ;
628   
629   if(debugLevel > 0) ana->Print("");
630   
631   return ana;
632   
633 }
634
635 //________________________________________________________
636 void ConfigureMC(AliAnaCaloTrackCorrBaseClass* ana, Bool_t simu = kFALSE)
637 {
638   if(simu) ana->SwitchOnDataMC() ;//Access MC stack and fill more histograms, AOD MC not implemented yet.
639   else     ana->SwitchOffDataMC() ;
640
641   //Set here generator name, default pythia
642   //ana->GetMCAnalysisUtils()->SetMCGenerator("");
643 }  
644
645 //________________________________________________________
646 void SetHistoRangeAndNBins (AliHistogramRanges* histoRanges, TString calorimeter = "EMCAL")
647 {
648   // Set common bins for all analysis and MC histograms filling
649     
650   histoRanges->SetHistoPtRangeAndNBins(-0.25, 99.75, 200) ; // Energy and pt histograms
651   
652   if(calorimeter=="EMCAL")
653   {
654     
655     histoRanges->SetHistoPhiRangeAndNBins(78*TMath::DegToRad(), 182*TMath::DegToRad(), 108) ;
656     histoRanges->SetHistoXRangeAndNBins(-600,90,200); // QA
657     histoRanges->SetHistoYRangeAndNBins(100,450,100); // QA
658
659     histoRanges->SetHistoEtaRangeAndNBins(-0.72, 0.72, 144) ;
660   }
661   else
662   {
663     histoRanges->SetHistoPhiRangeAndNBins(260*TMath::DegToRad(), 320*TMath::DegToRad(), 60) ;
664     histoRanges->SetHistoEtaRangeAndNBins(-0.13, 0.13, 130) ;
665   }
666   
667   histoRanges->SetHistoShowerShapeRangeAndNBins(-0.1, 4.9, 500);
668   
669   // Invariant mass histoRangeslysis
670   histoRanges->SetHistoMassRangeAndNBins(0., 1., 200) ;
671   histoRanges->SetHistoAsymmetryRangeAndNBins(0., 1. , 100) ;
672   
673   // check if time calibration is on
674   histoRanges->SetHistoTimeRangeAndNBins(-1000.,1000,1000);
675   histoRanges->SetHistoDiffTimeRangeAndNBins(-200, 200, 800);
676   
677   // track-cluster residuals
678   histoRanges->SetHistoTrackResidualEtaRangeAndNBins(-0.15,0.15,300);
679   histoRanges->SetHistoTrackResidualPhiRangeAndNBins(-0.15,0.15,300);
680   histoRanges->SetHistodRRangeAndNBins(0.,0.15,150);//QA
681
682   // QA, electron, charged
683   histoRanges->SetHistoPOverERangeAndNBins(0,  2.5 ,500);
684   histoRanges->SetHistodEdxRangeAndNBins  (0.,250.0,500);
685   
686   // QA
687   histoRanges->SetHistoFinePtRangeAndNBins(0, 10, 200) ; // bining for fhAmpId
688   histoRanges->SetHistoRatioRangeAndNBins(0.,2.,100);
689   histoRanges->SetHistoVertexDistRangeAndNBins(0.,500.,500);
690   histoRanges->SetHistoNClusterCellRangeAndNBins(0,50,50);
691   histoRanges->SetHistoZRangeAndNBins(-400,400,200);
692   histoRanges->SetHistoRRangeAndNBins(400,450,25);
693   histoRanges->SetHistoV0SignalRangeAndNBins(0,5000,500);
694   histoRanges->SetHistoV0MultiplicityRangeAndNBins(0,5000,500);
695   histoRanges->SetHistoTrackMultiplicityRangeAndNBins(0,5000,500);
696   
697 }
698
699 //_____________________________
700 UInt_t SetTriggerMaskFromName(TString trigger)
701 {
702   if(trigger=="EMC7")
703   {
704     printf("CaloTrackCorr trigger EMC7\n");
705     return AliVEvent::kEMC7;
706   }
707   else if (trigger=="INT7")
708   {
709     printf("CaloTrackCorr trigger INT7\n");
710     return AliVEvent::kINT7;
711   }
712   else if(trigger=="EMC1")
713   {
714     printf("CaloTrackCorr trigger EMC1\n");
715     return AliVEvent::kEMC1;
716   }
717   else if(trigger=="MB")
718   {
719     printf("CaloTrackCorr trigger MB\n");
720     return AliVEvent::kMB;
721   }  
722   else if(trigger=="PHOS")
723   {
724     printf("CaloTrackCorr trigger PHOS\n");
725     return AliVEvent::kPHI7;
726   }  
727   else if(trigger=="PHOSPb")
728   {
729     printf("CaloTrackCorr trigger PHOSPb\n");
730     return AliVEvent::kPHOSPb;
731   }
732   else if(trigger=="AnyINT")
733   {
734     printf("CaloTrackCorr trigger AnyINT\n");
735     return AliVEvent::kAnyINT;
736   }  
737   else if(trigger=="INT")
738   {
739     printf("CaloTrackCorr trigger AnyINT\n");
740     return AliVEvent::kAny;
741   }
742   else if(trigger=="EMCEGA")
743   {
744     printf("CaloTrackCorr trigger EMC Gamma\n");
745     return AliVEvent::kEMCEGA;
746   } 
747   else if(trigger=="EMCEJE")
748   {
749     printf("CaloTrackCorr trigger EMC Jet\n");
750     return AliVEvent::kEMCEJE;
751   }
752   else if(trigger=="Central")
753   {
754     printf("CaloTrackCorr trigger Central\n");
755     return (AliVEvent::kCentral  | AliVEvent::kMB);
756   }
757   else if(trigger=="CentralEGA")
758   {
759     printf("CaloTrackCorr trigger Central+EMCEGA\n");
760     return (AliVEvent::kCentral | AliVEvent::kEMCEGA);
761   }
762   else if(trigger=="SemiCentral")
763   {
764     printf("CaloTrackCorr trigger SemiCentral\n");
765     return (AliVEvent::kSemiCentral | AliVEvent::kMB);
766   }
767   else if(trigger=="SemiOrCentral")
768   {
769     printf("CaloTrackCorr trigger SemiCentral Or Central\n");
770     return (AliVEvent::kSemiCentral | AliVEvent::kCentral  | AliVEvent::kMB);
771   }
772 }
773