]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG4/macros/AddTaskPartCorr.C
fix coverity
[u/mrichter/AliRoot.git] / PWG4 / macros / AddTaskPartCorr.C
1 AliAnalysisTaskParticleCorrelation *AddTaskPartCorr
2 (
3  TString inputDataType, 
4  TString calorimeter, 
5  Bool_t kPrintSettings = kTRUE,
6  Bool_t kSimulation = kFALSE, 
7  Bool_t outputAOD=kFALSE, 
8  TString period = ""
9  ) {
10
11   // Creates a PartCorr task, configures it and adds it to the analysis manager.
12   
13   // Get the pointer to the existing analysis manager via the static access method.
14   //==============================================================================
15   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
16   if (!mgr) {
17     ::Error("AddTaskPartCorr", "No analysis manager to connect to.");
18     return NULL;
19   }  
20  
21   Bool_t kUseKinematics = kFALSE; 
22   if(kSimulation) { 
23     kUseKinematics = (mgr->GetMCtruthEventHandler())?kTRUE:kFALSE; 
24     if (!kUseKinematics && inputDataType == "AOD") kUseKinematics = kTRUE; //AOD primary should be available ... 
25   } 
26   
27   cout<<"********* ACCESS KINE? "<<kUseKinematics<<endl;
28   
29   // Configure analysis
30   //===========================================================================
31   
32   // *** Reader ***
33   AliCaloTrackReader * reader =0x0 ;
34   if(inputDataType.Contains("AOD")) reader = new AliCaloTrackAODReader();
35   else if(inputDataType=="ESD") reader = new AliCaloTrackESDReader();
36   else if(inputDataType=="MC" && inputDataType == "ESD") reader = new AliCaloTrackMCReader();
37   reader->SetDebug(-1);//10 for lots of messages
38   reader->SwitchOnCTS();
39   //reader->SetDeltaAODFileName("");
40   //if(!kSimulation) reader->SetFiredTriggerClassName("CINT1B-ABCE-NOPF-ALL");
41   if(calorimeter == "EMCAL") {
42     reader->SwitchOnEMCALCells();  
43     reader->SwitchOnEMCAL();
44   }
45   if(calorimeter == "PHOS") { 
46     reader->SwitchOnPHOSCells();  
47     reader->SwitchOnPHOS();
48   }
49   
50   // for case inputDataType="deltaAOD", no need to fill the EMCAL/PHOS cluster lists
51   if(inputDataType.Contains("delta")){
52     reader->SwitchOffEMCAL();
53     reader->SwitchOffPHOS();
54     reader->SwitchOffEMCALCells(); 
55     reader->SwitchOffPHOSCells(); 
56   }
57   
58   if(kUseKinematics){
59     if(inputDataType == "ESD"){
60       reader->SwitchOnStack();          
61       reader->SwitchOffAODMCParticles(); 
62     }
63     else if(inputDataType == "AOD"){
64       reader->SwitchOffStack();          
65       reader->SwitchOnAODMCParticles(); 
66     }
67   }
68
69   //-----------------------------------------------------------------
70   // Switch on cluster energy smearing 
71   //  -> SIMULATION
72   //  -> EMCAL
73   //-----------------------------------------------------------------
74
75   if (kSimulation && calorimeter == "EMCAL") {
76     //switch on cluster energy smearing
77     reader->SwitchOnClusterEnergySmearing();
78     reader->SetSmearingParameters(0,0.07);
79     reader->SetSmearingParameters(1,0.00);
80     reader->SetSmearingParameters(2,0.00);
81   }
82
83   
84   //-----------------------------------------------------------------
85   // Z vertex cut
86   reader->SetZvertexCut(10.);
87   //-----------------------------------------------------------------
88
89   //-----------------------------------------------------------------
90   // Min particle pT
91   //-----------------------------------------------------------------
92   reader->SetEMCALPtMin(0.3); 
93   reader->SetPHOSPtMin(0.3);
94   reader->SetCTSPtMin(0.1);
95
96   if(outputAOD)      reader->SwitchOnWriteDeltaAOD()  ;
97   if(kPrintSettings) reader->Print("");
98
99   // *** Calorimeters Utils     ***
100   AliCalorimeterUtils *cu = new AliCalorimeterUtils;
101
102   //-----------------------------------------------------------------
103   // Non-linearity corrections 
104   //  -> REAL DATA AND SIMULATION
105   //  -> EMCAL
106   //-----------------------------------------------------------------
107   if (calorimeter == "EMCAL") {
108     cu->GetEMCALRecoUtils()->SwitchOnRejectExoticCluster();
109     cu->SwitchOnCorrectClusterLinearity();
110     if (!kSimulation) {
111       cu->GetEMCALRecoUtils()->SetNonLinearityFunction(AliEMCALRecoUtils::kBeamTestCorrected);
112     }
113     else              {
114       cu->GetEMCALRecoUtils()->SetNonLinearityFunction(AliEMCALRecoUtils::kPi0MC);
115       cu->GetEMCALRecoUtils()->SetNonLinearityParam(0,1.001   ) ;
116       cu->GetEMCALRecoUtils()->SetNonLinearityParam(1,-0.01264) ;
117       cu->GetEMCALRecoUtils()->SetNonLinearityParam(2,-0.03632) ;
118       cu->GetEMCALRecoUtils()->SetNonLinearityParam(3,0.1798  ) ;
119       cu->GetEMCALRecoUtils()->SetNonLinearityParam(4,-0.522  ) ;
120     }
121   }
122   
123   //-----------------------------------------------------------------
124   //  Remove clusters close to borders, 
125   //  at least max energy cell is 1 cell away 
126   //-----------------------------------------------------------------
127   cu->SetNumberOfCellsFromEMCALBorder(1);
128   cu->SetNumberOfCellsFromPHOSBorder(2);
129   
130   
131   //-----------------------------------------------------------------
132   // Remove EMCAL hottest channels 
133   //  -> REAL DATA AND SIMULATION
134   //  -> EMCAL
135   // Recover the file from alien  
136   //   /alice/cern.ch/user/g/gconesab/BadChannelsDB
137   //-----------------------------------------------------------------
138   if (calorimeter == "EMCAL" && period !="") {
139     cu->SwitchOnBadChannelsRemoval();
140     cu->SwitchOnDistToBadChannelRecalculation();
141     TFile * fbad = new TFile("BadChannels.root","read");
142     TH2I * hbad0 = (TH2I*)fbad->Get("EMCALBadChannelMap_Mod0");
143     TH2I * hbad1 = (TH2I*)fbad->Get("EMCALBadChannelMap_Mod1");
144     TH2I * hbad2 = (TH2I*)fbad->Get("EMCALBadChannelMap_Mod2");
145     TH2I * hbad3 = (TH2I*)fbad->Get("EMCALBadChannelMap_Mod3");
146     cu->SetEMCALChannelStatusMap(0,hbad0);
147     cu->SetEMCALChannelStatusMap(1,hbad1);
148     cu->SetEMCALChannelStatusMap(2,hbad2);
149     cu->SetEMCALChannelStatusMap(3,hbad3);
150   }
151   
152   
153   //-----------------------------------------------------------------
154   // Misalignment + recalculate position 
155   //  -> REAL DATA and SIMULATION
156   //  -> EMCAL
157   //-----------------------------------------------------------------
158   if (calorimeter == "EMCAL") {
159     cu->SetEMCALGeometryName("EMCAL_FIRSTYEARV1");
160     cu->GetEMCALRecoUtils()->SetParticleType(AliEMCALRecoUtils::kPhoton);
161     cu->GetEMCALRecoUtils()->SetW0(4.5);      
162     cu->GetEMCALRecoUtils()->SetPositionAlgorithm(AliEMCALRecoUtils::kPosTowerGlobal);
163     cu->SwitchOnLoadOwnEMCALGeometryMatrices();
164     TGeoHMatrix *matrix[4];
165     
166     double rotationMatrix[4][9] = {-0.014587, -0.999892, -0.002031, 0.999892, -0.014591,  0.001979, -0.002009, -0.002002,  0.999996,
167                                    -0.014587,  0.999892,  0.002031, 0.999892,  0.014591, -0.001979, -0.002009,  0.002002, -0.999996,
168                                    -0.345864, -0.938278, -0.003412, 0.938276, -0.345874,  0.003010, -0.004004, -0.002161,  0.999990,
169                                    -0.345861,  0.938280,  0.003412, 0.938276,  0.345874, -0.003010, -0.004004,  0.002161, -0.999990};
170     
171     double translationMatrix[4][3] = {0.351659,    447.576446,  176.269742,
172                                       1.062577,    446.893974, -173.728870,
173                                       -154.213287, 419.306156,  176.753692,
174                                       -153.018950, 418.623681, -173.243605};
175     for(int j=0; j<4; j++)
176       {
177         matrix[j] = new TGeoHMatrix();
178         matrix[j]->SetRotation(rotationMatrix[j]);
179         matrix[j]->SetTranslation(translationMatrix[j]);
180         matrix[j]->Print();
181         cu->SetEMCALGeometryMatrixInSM(matrix[j],j);
182       }
183     //cu->SwitchOnRecalculateClusterTrackMatching();
184   }
185   
186   //-----------------------------------------------------------------
187   // Time dependent corrections 
188   //  -> REAL_DATA ONLY
189   //  -> EMCAL
190   //  Recover file from alien  
191   //  /alice/cern.ch/user/g/gconesab/TimeDepCorrectionDB
192   //-----------------------------------------------------------------
193   if (!kSimulation && calorimeter == "EMCAL" && period!="") {
194     cu->GetEMCALRecoUtils()->SwitchOnTimeDepCorrection();
195     char cmd[200] ;
196     sprintf(cmd, ".!tar xvfz CorrectionFiles.tgz >& /dev/null") ;
197     gROOT->ProcessLine(cmd) ;
198   }
199   
200   
201   //------------------------------------------------------------------------
202   //     Recalibration factors 
203   //       -> REAL DATA ONLY
204   //       -> EMCAL
205   //     Recover the file from alien for LHC10d pass2
206   //     /alice/cern.ch/user/g/gconesab/RecalDB/december2010        -> LHC10d pass2
207   //     /alice/cern.ch/user/g/gconesab/RecalDB/summer_december2010 -> LHC10e pass1
208   //  ******
209   //     For other periods/passes, see
210   //     https://twiki.cern.ch/twiki/bin/view/ALICE/EMCalOffline#Summary_of_Calibration_and_Align
211   //------------------------------------------------------------------------
212   
213   if (calorimeter == "EMCAL" && period !="") {
214     cu->SwitchOnRecalibration();
215     TFile* f = 0x0 ;
216     if (!kSimulation) {
217       if      (period == "LHC10d") f = new TFile("RecalibrationFactors_LHC10d.root","read");
218       else if (period == "LHC10e") f = new TFile("RecalibrationFactors_LHC10e.root","read");
219       else                         Fatal("AddTaskPartCorr","run period not supported");
220     }
221     else {
222       f = new TFile("DecalibrationFactors.root","read");
223     }
224     if (!f || !f->IsOpen()) Fatal("AddTaskPartCorr","Re(De)-calibration file not found");
225
226     Info("AddTaskPartCorr",Form("Using calibration files for period %s",period.Data()));
227
228     TH2F * h0 = (TH2F*)f->Get("EMCALRecalFactors_SM0");
229     TH2F * h1 = (TH2F*)f->Get("EMCALRecalFactors_SM1");
230     TH2F * h2 = (TH2F*)f->Get("EMCALRecalFactors_SM2");
231     TH2F * h3 = (TH2F*)f->Get("EMCALRecalFactors_SM3");
232     cu->SetEMCALChannelRecalibrationFactors(0,h0);
233     cu->SetEMCALChannelRecalibrationFactors(1,h1);
234     cu->SetEMCALChannelRecalibrationFactors(2,h2);
235     cu->SetEMCALChannelRecalibrationFactors(3,h3);
236   }
237
238   cu->SetDebug(-1);
239
240
241   // ##### Analysis algorithm settings ####
242   
243   // -------------------------------------------------
244   // --- Photon/Pi0/Omega/Electron Analysis ---
245   // -------------------------------------------------
246   
247   AliAnaPhoton *anaphoton = new AliAnaPhoton();
248   anaphoton->SetDebug(-1); //10 for lots of messages
249
250   if(calorimeter == "PHOS"){
251     anaphoton->SetNCellCut(2);
252     anaphoton->SetMinPt(0.3);
253     anaphoton->SetMinDistanceToBadChannel(2, 4, 5);
254   }
255   else {//EMCAL
256     anaphoton->SetNCellCut(1);
257     anaphoton->SetMinPt(0.); 
258     //if(!kUseKinematics) anaphoton->SetTimeCut(400,900);// Time window of [400-900] ns
259     anaphoton->SetMinDistanceToBadChannel(1, 2, 3);
260   }
261   anaphoton->SetCalorimeter(calorimeter);
262   if(kUseKinematics) anaphoton->SwitchOnDataMC() ;//Access MC stack and fill more histograms
263   else  anaphoton->SwitchOffDataMC() ;
264   anaphoton->SwitchOffCaloPID();
265   anaphoton->SwitchOffFiducialCut();
266   if(kSimulation){
267     anaphoton->SwitchOnFiducialCut();
268     AliFiducialCut * fidCut1stYear = anaphoton->GetFiducialCut();
269     fidCut1stYear->DoCTSFiducialCut(kFALSE) ;
270     fidCut1stYear->DoEMCALFiducialCut(kTRUE) ;
271     fidCut1stYear->DoPHOSFiducialCut(kTRUE) ;
272     fidCut1stYear->SetSimpleEMCALFiducialCut(0.7,80.,120.);
273     fidCut1stYear->SetSimplePHOSFiducialCut(0.12,260.,320.);
274   }
275   
276   if(!inputDataType.Contains("delta")) {
277     anaphoton->SetOutputAODName(Form("Photons%s",calorimeter.Data()));
278     anaphoton->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
279   }
280   else anaphoton->SetInputAODName(Form("Photons%s",calorimeter.Data()));
281   anaphoton->AddToHistogramsName("AnaPhotonCorr_");
282   //Set Histograms bins and ranges
283   anaphoton->SetHistoPtRangeAndNBins(0, 20, 200) ;
284   if(kPrintSettings) anaphoton->Print("");
285   
286   // -----------------------------------
287   // --- Pi0 Invariant Mass Analysis ---
288   // -----------------------------------
289   
290   AliAnaPi0 *anapi0 = new AliAnaPi0();
291   anapi0->SetDebug(-1);//10 for lots of messages
292   anapi0->SetInputAODName(Form("Photons%s",calorimeter.Data()));
293   anapi0->SetCalorimeter(calorimeter);
294   anapi0->SwitchOnMultipleCutAnalysis(); 
295   if(kSimulation){
296     anapi0->SwitchOnFiducialCut();
297     AliFiducialCut * fidCut1stYear = anapi0->GetFiducialCut();
298     fidCut1stYear->DoCTSFiducialCut(kFALSE) ;
299     fidCut1stYear->DoEMCALFiducialCut(kTRUE) ;
300     fidCut1stYear->DoPHOSFiducialCut(kTRUE) ;
301     fidCut1stYear->SetSimpleEMCALFiducialCut(0.7,80.,120.);
302     fidCut1stYear->SetSimplePHOSFiducialCut(0.12,260.,320.);
303   }     
304
305   //settings for pp collision
306   anapi0->SwitchOnOwnMix();
307   anapi0->SwitchOnEventSelection() ;
308   anapi0->SetNCentrBin(1);
309   //anapi0->SetMultiplicity(80, 120);
310   anapi0->SetMultiBin(1);  
311   if(kUseKinematics)anapi0->SwitchOnDataMC() ;//Access MC stack and fill more histograms
312   else anapi0->SwitchOffDataMC() ;
313   if(calorimeter=="PHOS") anapi0->SetNumberOfModules(3); //PHOS first year
314   else  anapi0->SetNumberOfModules(4); //EMCAL first year
315   anapi0->SetHistoPtRangeAndNBins(0, 20, 40) ;
316   //anapi0->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 100) ;
317   //anapi0->SetHistoEtaRangeAndNBins(-0.8, 0.8, 200) ;
318   anapi0->SetHistoMassRangeAndNBins(0., 0.9, 300) ;
319   anapi0->SetHistoAsymmetryRangeAndNBins(0., 1. , 100) ;
320   anapi0->SetHistoTrackMultiplicityRangeAndNBins(0, 200, 20); 
321
322   if(kPrintSettings) anapi0->Print("");
323         
324   //---------------------------  
325   //Pi0, event by event
326   //---------------------------  
327   
328   AliAnaPi0EbE *anapi0ebe = new AliAnaPi0EbE();
329   anapi0ebe->SwitchOffEventSelection() ;
330   //anapi0ebe->SetMultiplicity(80, 120);
331   anapi0ebe->SetMultiBin(1);  
332   anapi0ebe->SetDebug(-1);//10 for lots of messages
333   anapi0ebe->SetAnalysisType(AliAnaPi0EbE::kIMCalo);
334   anapi0ebe->SetMinPt(0);
335   anapi0ebe->SetCalorimeter(calorimeter);
336   anapi0ebe->SetInputAODName(Form("Photons%s",calorimeter.Data()));
337   if(!inputDataType.Contains("delta")) {
338     anapi0ebe->SetOutputAODName(Form("Pi0s%s",calorimeter.Data()));
339     anapi0ebe->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
340   }
341   else  anapi0ebe->SetInputAODName(Form("Pi0s%s",calorimeter.Data()));
342   
343   if(kUseKinematics) anapi0ebe->SwitchOnDataMC() ;//Access MC stack and fill more histograms
344   else  anapi0ebe->SwitchOffDataMC() ;  
345   
346   AliNeutralMesonSelection *nms = anapi0ebe->GetNeutralMesonSelection();
347   nms->SetInvMassCutRange(0.08, 0.18)     ;
348   nms->KeepNeutralMesonSelectionHistos(kTRUE);
349   //Set Histrograms bins and ranges
350   if(calorimeter=="EMCAL" ){
351     nms->SetHistoERangeAndNBins(0, 15, 150) ;  
352     anapi0ebe->SetHistoPtRangeAndNBins(0, 30, 60) ;
353   }
354   else{
355     nms->SetHistoERangeAndNBins(0, 30, 200) ;  
356     anapi0ebe->SetHistoPtRangeAndNBins(0, 30, 100) ;
357   }
358   //      nms->SetHistoPtRangeAndNBins(0, 50, 100) ;
359   //      nms->SetHistoAngleRangeAndNBins(0, 0.3, 100) ;
360   //      nsm->SetHistoIMRangeAndNBins(0, 0.4, 100) ;  
361   //Set Histrograms bins and ranges
362   //      anapi0->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 100) ;
363   //      anapi0->SetHistoEtaRangeAndNBins(-0.7, 0.7, 100) ;
364   if(kPrintSettings) anapi0ebe->Print("");
365         
366   //-------------------------------------
367   //*** analysis the omega->pi0+gamma ***
368   //------------------------------------
369   AliAnaOmegaToPi0Gamma *anaomegaToPi0Gamma = new AliAnaOmegaToPi0Gamma();
370   anaomegaToPi0Gamma->SetDebug(-1);//10 for lots of messages
371   anaomegaToPi0Gamma->SetInputAODName(Form("Pi0s%s",calorimeter.Data()));
372   anaomegaToPi0Gamma->SetInputAODPhotonName(Form("Photons%s",calorimeter.Data()));
373   anaomegaToPi0Gamma->SetNPID(1);
374   anaomegaToPi0Gamma->SetNVtxZ(1);
375   anaomegaToPi0Gamma->SetNEventsMixed(4);
376   if(calorimeter=="PHOS")
377     anaomegaToPi0Gamma->SetPi0MassPeakWidthCut(0.008); // PHOS
378   else if(calorimeter=="EMCAL")
379     anaomegaToPi0Gamma->SetPi0MassPeakWidthCut(0.012); // EMCAL 
380   anaomegaToPi0Gamma->SetHistoPtRangeAndNBins(0, 20, 100) ;
381   anaomegaToPi0Gamma->SetHistoMassRangeAndNBins(0, 1, 100) ;
382   anaomegaToPi0Gamma->SetPi0OverOmegaPtCut(0.8);
383   anaomegaToPi0Gamma->SetGammaOverOmegaPtCut(0.2);
384   if(kUseKinematics) anaomegaToPi0Gamma->SwitchOnDataMC() ;//Access MC stack and fill more histograms
385   else anaomegaToPi0Gamma->SwitchOffDataMC() ;//Access MC stack and fill more histograms
386   anaomegaToPi0Gamma->AddToHistogramsName(Form("AnaOmegaToPi0Gamma%s_",calorimeter.Data()));
387   if(kPrintSettings)   anaomegaToPi0Gamma->Print("");
388         
389         
390 //  //---------------------------------------------------------------------
391 //  // Electron/btag
392 //  //---------------------------------------------------------------------
393 //  if(calorimeter=="EMCAL"){
394 //    
395 //    AliAnaBtag *anabtag = new AliAnaBtag();
396 //    anabtag->SetDebug(-1); //10 for lots of messages
397 //    if(kUseKinematics){
398 //      anabtag->SwitchOnDataMC();
399 //      anabtag->SetMinPt(1.);
400 //    }
401 //    anabtag->SetOutputAODName("ElectronsEMCAL");
402 //    anabtag->SetOutputAODClassName("AliAODPWG4Particle");
403 //    //anabtag->SetHistoPtRangeAndNBins(0, 100, 100) ;
404 //    //anabtag->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 100) ;
405 //    //anabtag->SetHistoEtaRangeAndNBins(-0.7, 0.7, 100) ;
406 //    if(kPrintSettings)anabtag->Print("");
407 //  }
408   
409   //==================================
410   // ### Isolation analysis ### 
411   //=================================
412   //Photon
413   AliAnaParticleIsolation *anaisol = new AliAnaParticleIsolation();
414   anaisol->SetDebug(-1);
415   anaisol->SetMinPt(0);
416   anaisol->SetInputAODName(Form("Photons%s",calorimeter.Data()));
417   anaisol->SetAODObjArrayName("ICPhoton"); 
418   anaisol->SetCalorimeter(calorimeter);
419   if(kUseKinematics) anaisol->SwitchOnDataMC() ;//Access MC stack and fill more histograms
420   else  anaisol->SwitchOffDataMC() ;
421   //Select clusters with no pair, if both clusters with pi0 mass
422   anaisol->SwitchOffInvariantMass();
423   //Do isolation cut
424   AliIsolationCut * ic =  anaisol->GetIsolationCut();   
425   ic->SetConeSize(0.4);
426   ic->SetPtThreshold(0.7);
427   ic->SetPtFraction(0.1);
428   ic->SetSumPtThreshold(1.0) ;
429   ic->SetParticleTypeInCone(AliIsolationCut::kOnlyCharged);
430   ic->SetICMethod(AliIsolationCut::kSumPtFracIC);
431   if(kPrintSettings) ic->Print("");
432   
433   //Do or not do isolation with previously produced AODs.
434   //No effect if use of SwitchOnSeveralIsolation()
435   anaisol->SwitchOffReIsolation();
436   //Multiple IC
437   anaisol->SwitchOffSeveralIsolation() ;
438   //Set Histograms bins and ranges
439   anaisol->SetHistoPtRangeAndNBins(0, 50, 200) ;
440   //      ana->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 100) ;
441   //      ana->SetHistoEtaRangeAndNBins(-0.7, 0.7, 100) ;
442   anaisol->AddToHistogramsName("AnaIsolPhoton_");
443   if(kPrintSettings) anaisol->Print("");
444   
445   //Pi0
446   AliAnaParticleIsolation *anaisolpi0 = new AliAnaParticleIsolation();
447   anaisolpi0->SetDebug(-1);
448   anaisolpi0->SetMinPt(0);
449   anaisolpi0->SetInputAODName(Form("Pi0s%s",calorimeter.Data()));
450   anaisolpi0->AddToHistogramsName("AnaIsolPi0_");
451   anaisolpi0->SetAODObjArrayName("ICPi0"); 
452   anaisolpi0->SetCalorimeter(calorimeter);
453   if(kUseKinematics) anaisolpi0->SwitchOnDataMC() ;//Access MC stack and fill more histograms
454   else  anaisolpi0->SwitchOffDataMC() ;
455   //Select clusters with no pair, if both clusters with pi0 mass
456   anaisolpi0->SwitchOffInvariantMass();
457   //Do isolation cut
458   AliIsolationCut * ic2 =  anaisolpi0->GetIsolationCut();       
459   ic2->SetConeSize(0.4);
460   ic2->SetPtThreshold(0.7);
461   ic2->SetPtFraction(0.1);
462   ic2->SetSumPtThreshold(1.0) ;
463   ic2->SetICMethod(AliIsolationCut::kSumPtFracIC);
464   ic2->SetParticleTypeInCone(AliIsolationCut::kOnlyCharged);
465   if(kPrintSettings) ic2->Print("");
466   //Do or not do isolation with previously produced AODs.
467   //No effect if use of SwitchOnSeveralIsolation()
468   anaisolpi0->SwitchOffReIsolation();
469   //Multiple IC
470   anaisolpi0->SwitchOffSeveralIsolation() ;
471   //Set Histograms bins and ranges
472   anaisolpi0->SetHistoPtRangeAndNBins(0, 50, 200) ;
473   //      ana->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 100) ;
474   //      ana->SetHistoEtaRangeAndNBins(-0.7, 0.7, 100) ;
475   if(kPrintSettings) anaisolpi0->Print("");
476         
477   //===========================
478   //Correlation analysis
479   //===========================
480         
481   // ### Correlation with Jet Finder AOD output
482   AliAnaParticleJetFinderCorrelation *anacorrjet = new AliAnaParticleJetFinderCorrelation();
483   anacorrjet->SetInputAODName(Form("Photons%s",calorimeter.Data()));
484   anacorrjet->SwitchOffFiducialCut();
485   anacorrjet->SetDebug(-1);
486   anacorrjet->SetConeSize(1);  
487   anacorrjet->SelectIsolated(kTRUE); // do correlation with isolated photons
488   anacorrjet->SetPtThresholdInCone(0.2);
489   anacorrjet->SetDeltaPhiCutRange(0.5,5.5);//Mostly Open Cuts 
490   anacorrjet->SetRatioCutRange(0.01,3); //Mostly Open Cuts
491   anacorrjet->UseJetRefTracks(kFALSE); //Not working now
492   //Set Histograms bins and ranges
493   anacorrjet->SetHistoPtRangeAndNBins(0, 50, 200) ;
494   //      ana->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 100) ;
495   //      ana->SetHistoEtaRangeAndNBins(-0.7, 0.7, 100) ;
496   if(kPrintSettings) anacorrjet->Print("");
497   
498   // ### Correlation with hadrons
499   AliAnaParticleHadronCorrelation *anacorrhadron = new AliAnaParticleHadronCorrelation();
500   anacorrhadron->SetInputAODName(Form("Photons%s",calorimeter.Data()));
501   anacorrhadron->AddToHistogramsName("AnaHadronCorrPhoton_");
502   anacorrhadron->SetAODObjArrayName("PhotonHadronCorr"); 
503   anacorrhadron->SetDebug(-1);
504   anacorrhadron->SwitchOffCaloPID();
505   if(kSimulation){
506     anacorrhadron->SwitchOnFiducialCut();
507     AliFiducialCut * fidCut1stYear = anacorrhadron->GetFiducialCut();
508     fidCut1stYear->DoEMCALFiducialCut(kTRUE) ;
509     fidCut1stYear->DoPHOSFiducialCut(kTRUE) ;
510     fidCut1stYear->SetSimpleEMCALFiducialCut(0.7,80.,120.);
511     fidCut1stYear->SetSimplePHOSFiducialCut(0.12,260.,320.);
512     fidCut1stYear->DoCTSFiducialCut(kTRUE) ;
513     fidCut1stYear->SetSimpleCTSFiducialCut(0.8,0.,360.);    
514   }
515   anacorrhadron->SwitchOnDecayCorr();
516   anacorrhadron->SetMultiBin(1);
517   anacorrhadron->SwitchOffNeutralCorr();
518   anacorrhadron->SwitchOffEventSelection();
519   anacorrhadron->SetPtCutRange(0.1,100);
520   anacorrhadron->SetDeltaPhiCutRange(1.5,4.5);
521   anacorrhadron->SwitchOnSeveralUECalculation();
522   anacorrhadron->SetUeDeltaPhiCutRange(TMath::Pi()/3, 2*TMath::Pi()/3);
523   anacorrhadron->SelectIsolated(kFALSE); // do correlation with isolated photons
524   if(kUseKinematics) anacorrhadron->SwitchOnDataMC() ;//Access MC stack and fill more histograms
525   else  anacorrhadron->SwitchOffDataMC() ;
526   //if(calorimeter=="PHOS"){
527   //Correlate with particles in EMCAL
528   //anacorrhadron->SwitchOnCaloPID();
529   //anacorrhadron->SwitchOnCaloPIDRecalculation(); //recommended for EMCAL
530   //}
531   //Set Histograms bins and ranges
532   anacorrhadron->SetHistoPtRangeAndNBins(0, 50, 200) ;
533   //      ana->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 100) ;
534   //      ana->SetHistoEtaRangeAndNBins(-0.7, 0.7, 100) ;
535   if(kPrintSettings) anacorrhadron->Print("");
536   
537   // ### Correlation with hadrons
538   AliAnaParticleHadronCorrelation *anacorrisohadron = new AliAnaParticleHadronCorrelation();
539   anacorrisohadron->SetInputAODName(Form("Photons%s",calorimeter.Data()));
540   anacorrisohadron->AddToHistogramsName("AnaHadronCorrIsoPhoton_");
541   anacorrisohadron->SetAODObjArrayName("IsoPhotonHadronCorr"); 
542   anacorrisohadron->SetDebug(-1);
543   anacorrisohadron->SwitchOffCaloPID();
544   if(kSimulation){
545     anacorrisohadron->SwitchOnFiducialCut();
546     AliFiducialCut * fidCut1stYear = anacorrisohadron->GetFiducialCut();
547     fidCut1stYear->DoEMCALFiducialCut(kTRUE) ;
548     fidCut1stYear->DoPHOSFiducialCut(kTRUE) ;
549     fidCut1stYear->SetSimpleEMCALFiducialCut(0.7,80.,120.);
550     fidCut1stYear->SetSimplePHOSFiducialCut(0.12,260.,320.);
551     fidCut1stYear->DoCTSFiducialCut(kTRUE) ;
552     fidCut1stYear->SetSimpleCTSFiducialCut(0.8,0.,360.);    
553   }
554   anacorrisohadron->SwitchOnDecayCorr();
555   anacorrisohadron->SetMultiBin(1);
556   anacorrisohadron->SwitchOffNeutralCorr();
557   anacorrisohadron->SwitchOffEventSelection();
558   anacorrisohadron->SetPtCutRange(0.1,100);
559   anacorrisohadron->SetDeltaPhiCutRange(1.5,4.5);
560   anacorrisohadron->SwitchOnSeveralUECalculation();
561   anacorrisohadron->SetUeDeltaPhiCutRange(TMath::Pi()/3, 2*TMath::Pi()/3);
562   anacorrisohadron->SelectIsolated(kTRUE); // do correlation with isolated photons
563   if(kUseKinematics) anacorrisohadron->SwitchOnDataMC() ;//Access MC stack and fill more histograms
564   else  anacorrisohadron->SwitchOffDataMC() ;
565   //if(calorimeter=="PHOS"){
566   //Correlate with particles in EMCAL
567   //anacorrhadron->SwitchOnCaloPID();
568   //anacorrhadron->SwitchOnCaloPIDRecalculation(); //recommended for EMCAL
569   //}
570   //Set Histograms bins and ranges
571   anacorrisohadron->SetHistoPtRangeAndNBins(0, 50, 200) ;
572   //      ana->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 100) ;
573   //      ana->SetHistoEtaRangeAndNBins(-0.7, 0.7, 100) ;
574   if(kPrintSettings) anacorrisohadron->Print("");
575   
576   
577   // ### Pi0 Correlation with hadrons, not isolated
578   AliAnaParticleHadronCorrelation *anacorrhadronpi0 = new AliAnaParticleHadronCorrelation();
579   anacorrhadronpi0->SetInputAODName(Form("Pi0s%s",calorimeter.Data()));
580   anacorrhadronpi0->AddToHistogramsName("AnaHadronCorrPi0_");
581   anacorrhadronpi0->SetAODObjArrayName("Pi0HadronCorr"); 
582   anacorrhadronpi0->SetDebug(-1);
583   anacorrhadronpi0->SwitchOffCaloPID();
584   if(kSimulation){
585     anacorrhadronpi0->SwitchOnFiducialCut();
586     AliFiducialCut * fidCut1stYear = anacorrhadronpi0->GetFiducialCut();
587     fidCut1stYear->DoEMCALFiducialCut(kTRUE) ;
588     fidCut1stYear->DoPHOSFiducialCut(kTRUE) ;
589     fidCut1stYear->SetSimpleEMCALFiducialCut(0.7,80.,120.);
590     fidCut1stYear->SetSimplePHOSFiducialCut(0.12,260.,320.);
591     fidCut1stYear->DoCTSFiducialCut(kTRUE) ;
592     fidCut1stYear->SetSimpleCTSFiducialCut(0.8,0.,360.);    
593   }
594   anacorrhadronpi0->SwitchOnDecayCorr();
595   anacorrhadronpi0->SetMultiBin(1);
596   anacorrhadronpi0->SwitchOffNeutralCorr();
597   anacorrhadronpi0->SwitchOffEventSelection();
598   anacorrhadronpi0->SetPtCutRange(0.1,100);
599   anacorrhadronpi0->SetDeltaPhiCutRange(1.5,4.5);
600   anacorrhadronpi0->SelectIsolated(kFALSE); // do correlation with non isolated pi0
601   anacorrhadronpi0->SwitchOnSeveralUECalculation();
602   anacorrhadronpi0->SetUeDeltaPhiCutRange(TMath::Pi()/3, 2*TMath::Pi()/3);
603   if(kUseKinematics) anacorrhadronpi0->SwitchOnDataMC() ;//Access MC stack and fill more histograms
604   else  anacorrhadronpi0->SwitchOffDataMC() ;
605   //if(calorimeter=="PHOS"){
606   //    //Correlate with particles in EMCAL
607   //    anacorrhadronpi0->SwitchOnCaloPID();
608   //    anacorrhadronpi0->SwitchOnCaloPIDRecalculation(); //recommended for EMCAL
609   //}
610   //Set Histograms bins and ranges
611   anacorrhadronpi0->SetHistoPtRangeAndNBins(0, 50, 200) ;
612   //      ana->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 100) ;
613   //      ana->SetHistoEtaRangeAndNBins(-0.7, 0.7, 100) ;
614   if(kPrintSettings) anacorrhadronpi0->Print("");
615   
616   // ### Pi0 Correlation with hadrons, isolated
617   AliAnaParticleHadronCorrelation *anacorrhadronisopi0 = new AliAnaParticleHadronCorrelation();
618   anacorrhadronisopi0->SetInputAODName(Form("Pi0s%s",calorimeter.Data()));
619   anacorrhadronisopi0->AddToHistogramsName("AnaHadronCorrIsoPi0_");
620   anacorrhadronisopi0->SetAODObjArrayName("IsoPi0HadronCorr"); 
621   anacorrhadronisopi0->SetDebug(-1);
622   anacorrhadronisopi0->SwitchOffCaloPID();
623   if(kSimulation){
624     anacorrhadronisopi0->SwitchOnFiducialCut();
625     AliFiducialCut * fidCut1stYear = anacorrhadronisopi0->GetFiducialCut();
626     fidCut1stYear->DoEMCALFiducialCut(kTRUE) ;
627     fidCut1stYear->DoPHOSFiducialCut(kTRUE) ;
628     fidCut1stYear->SetSimpleEMCALFiducialCut(0.7,80.,120.);
629     fidCut1stYear->SetSimplePHOSFiducialCut(0.12,260.,320.);
630     fidCut1stYear->DoCTSFiducialCut(kTRUE) ;
631     fidCut1stYear->SetSimpleCTSFiducialCut(0.8,0.,360.);    
632   }
633   anacorrhadronisopi0->SwitchOnDecayCorr();
634   anacorrhadronisopi0->SetMultiBin(1);
635   anacorrhadronisopi0->SwitchOffNeutralCorr();
636   anacorrhadronisopi0->SwitchOffEventSelection();
637   anacorrhadronisopi0->SetPtCutRange(0.1,100);
638   anacorrhadronisopi0->SetDeltaPhiCutRange(1.5,4.5);
639   anacorrhadronisopi0->SelectIsolated(kTRUE); // do correlation with isolated pi0
640   anacorrhadronisopi0->SwitchOnSeveralUECalculation();
641   anacorrhadronisopi0->SetUeDeltaPhiCutRange(TMath::Pi()/3, 2*TMath::Pi()/3);
642   if(kUseKinematics) anacorrhadronisopi0->SwitchOnDataMC() ;//Access MC stack and fill more histograms
643   else  anacorrhadronisopi0->SwitchOffDataMC() ;
644   //if(calorimeter=="PHOS"){
645   //    //Correlate with particles in EMCAL
646   //    anacorrhadronpi0->SwitchOnCaloPID();
647   //    anacorrhadronpi0->SwitchOnCaloPIDRecalculation(); //recommended for EMCAL
648   //}
649   //Set Histograms bins and ranges
650   anacorrhadronisopi0->SetHistoPtRangeAndNBins(0, 50, 200) ;
651   //      ana->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 100) ;
652   //      ana->SetHistoEtaRangeAndNBins(-0.7, 0.7, 100) ;
653   if(kPrintSettings) anacorrhadronisopi0->Print("");
654   
655   
656   // #### Configure Maker ####
657   AliAnaPartCorrMaker * maker = new AliAnaPartCorrMaker();
658   maker->SetReader(reader);//pointer to reader
659   maker->SetCaloUtils(cu); //pointer to calorimeter utils
660
661
662   Int_t n = 0;//Analysis number, order is important
663   // Particle selection analysis
664   maker->AddAnalysis(anaphoton,n++);
665   //maker->AddAnalysis(anapi0,n++);
666     maker->AddAnalysis(anapi0ebe,n++);
667 //   maker->AddAnalysis(anaomegaToPi0Gamma,n++);  
668   //if(calorimeter=="EMCAL")maker->AddAnalysis(anabtag,n++);   
669   // Isolation analysis
670     maker->AddAnalysis(anaisol,n++);
671     maker->AddAnalysis(anaisolpi0,n++);
672   // Correlation analysis
673 //   maker->AddAnalysis(anacorrjet,n++);
674    maker->AddAnalysis(anacorrhadron,n++);
675    maker->AddAnalysis(anacorrhadronpi0,n++);
676    maker->AddAnalysis(anacorrisohadron,n++);
677    maker->AddAnalysis(anacorrhadronisopi0,n);
678   maker->SetAnaDebug(0)  ;
679   maker->SwitchOnHistogramsMaker()  ;
680   if(inputDataType.Contains("delta")) maker->SwitchOffAODsMaker()  ;
681   else                                maker->SwitchOnAODsMaker()  ;
682         
683   if(kPrintSettings) maker->Print("");
684
685   printf("======================== \n");
686   printf(" End Configuration of PartCorr analysis with detector %s \n",calorimeter.Data());
687   printf("======================== \n");
688   
689   // Create task
690   //===========================================================================
691   AliAnalysisTaskParticleCorrelation * task = new AliAnalysisTaskParticleCorrelation (Form("PartCorr%s",calorimeter.Data()));
692   task->SetConfigFileName(""); //Don't configure the analysis via configuration file.
693   //task->SetDebugLevel(-1);
694   task->SetAnalysisMaker(maker);
695   if(inputDataType=="ESD" && !kSimulation) task->SelectCollisionCandidates(); //AliPhysicsSelection has to be attached before.
696   mgr->AddTask(task);
697   
698   //Create containers
699   char name[128];
700   sprintf(name,"PartCorr_%s",calorimeter.Data());
701   cout<<"Name of task "<<name<<endl;
702   //AliAnalysisDataContainer *cout_pc = mgr->CreateContainer(Form(name),TList::Class(),
703   //                                       AliAnalysisManager::kOutputContainer, Form("PartCorr_%s.root",calorimeter.Data()));
704   
705   TString outputfile = AliAnalysisManager::GetCommonFileName();
706
707   //  AliAnalysisDataContainer *cout_pc = mgr->CreateContainer(Form("PartCorr_%s",calorimeter.Data()),  TList::Class(), AliAnalysisManager::kOutputContainer, Form("%s:PartCorr_%s",outputfile.Data(),calorimeter.Data()));
708   AliAnalysisDataContainer *cout_pc   = mgr->CreateContainer(calorimeter.Data(), TList::Class(), 
709                                                              AliAnalysisManager::kOutputContainer, 
710                                                              Form("%s:PartCorr",outputfile.Data()));
711         
712   AliAnalysisDataContainer *cout_cuts = mgr->CreateContainer(Form("%sCuts",calorimeter.Data()), TList::Class(), 
713                                                              AliAnalysisManager::kParamContainer, 
714                                                              Form("%s:PartCorrCuts",outputfile.Data()));
715   
716   // Create ONLY the output containers for the data produced by the task.
717   // Get and connect other common input/output containers via the manager as below
718   //==============================================================================
719   mgr->ConnectInput  (task, 0, mgr->GetCommonInputContainer());
720   // AOD output slot will be used in a different way in future
721   if(!inputDataType.Contains("delta")   && outputAOD) mgr->ConnectOutput (task, 0, mgr->GetCommonOutputContainer());
722   mgr->ConnectOutput (task, 1, cout_pc);
723   mgr->ConnectOutput (task, 2, cout_cuts);
724
725   return task;
726 }