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