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