After last changes in the reader default setting for filling input of detectors is...
[u/mrichter/AliRoot.git] / PWG4 / macros / AddTaskPartCorr.C
1 AliAnalysisTaskParticleCorrelation *AddTaskPartCorr(TString data, TString calorimeter, Bool_t kUseKinematics = kFALSE, Bool_t kPrintSettings = kFALSE)
2 {
3   // Creates a PartCorr task, configures it and adds it to the analysis manager.
4   
5   // Get the pointer to the existing analysis manager via the static access method.
6   //==============================================================================
7   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
8   if (!mgr) {
9     ::Error("AddTaskPartCorr", "No analysis manager to connect to.");
10     return NULL;
11   }  
12   
13   // Check the analysis type using the event handlers connected to the analysis manager.
14   //==============================================================================
15   if (!mgr->GetInputEventHandler()) {
16     ::Error("AddTaskPartCorr", "This task requires an input event handler");
17     return NULL;
18   }
19    TString inputDataType = mgr->GetInputEventHandler()->GetDataType(); // can be "ESD" or "AOD"
20    //cout<<"DATA TYPE :: "<<inputDataType<<endl;
21    // inputDataType: data managed by the input handler
22    // data: can be same as one managed by input handler, or the output AOD created by the filter. By default use AOD
23         
24    // Configure analysis
25    //===========================================================================
26   
27   //Reader
28   AliCaloTrackReader * reader = 0x0;
29   if(data=="AOD") reader = new AliCaloTrackAODReader();
30   else if(data=="ESD") reader = new AliCaloTrackESDReader();
31   else if(data=="MC" && dataType == "ESD") reader = new AliCaloTrackMCReader();
32   reader->SetDebug(-1);//10 for lots of messages
33   reader->SwitchOnCTS();
34   if(calorimeter == "EMCAL") {
35           reader->SwitchOnEMCALCells();  
36           reader->SwitchOnEMCAL();
37   }
38   if(calorimeter == "PHOS") { 
39           reader->SwitchOnPHOSCells();  
40           reader->SwitchOnPHOS();
41   }
42   if(kUseKinematics){
43         if(inputDataType == "ESD"){
44                 reader->SwitchOnStack();          
45                 reader->SwitchOffAODMCParticles(); 
46         }
47         else if(inputDataType == "AOD"){
48                 reader->SwitchOffStack();          
49                 reader->SwitchOnAODMCParticles(); 
50         }
51   }
52         
53   //Min particle pT
54   reader->SetEMCALPtMin(0.2); 
55   reader->SetPHOSPtMin(0.2);
56   reader->SetCTSPtMin(0.2);
57   if(kPrintSettings) reader->Print("");
58         
59   // ##### Analysis algorithm settings ####
60
61   // --------------------
62   // --- Pi0 Analysis ---
63   // --------------------
64   
65   AliCaloPID * pid = new AliCaloPID();
66   pid->SetDispersionCut(1.5);
67   pid->SetTOFCut(5.e-9);
68   pid->SetDebug(-1);
69   if(kPrintSettings) pid->Print("");
70         
71   AliFidutialCut * fidCut = new AliFidutialCut();
72   fidCut->DoCTSFidutialCut(kFALSE) ;
73   fidCut->DoEMCALFidutialCut(kTRUE) ;
74   fidCut->DoPHOSFidutialCut(kTRUE) ;
75         
76   AliAnaCalorimeterQA *qa = new AliAnaCalorimeterQA();
77   qa->SetDebug(-1); //10 for lots of messages
78   qa->SetCalorimeter(calorimeter);
79   if(kUseKinematics && inputDataType!="AOD") qa->SwitchOnDataMC() ;//Access MC stack and fill more histograms, AOD MC not implemented yet.
80   else  qa->SwitchOffDataMC() ;
81   //qa->AddToHistogramsName(Form("AnaCaloQA_%s",calorimeter.Data()));
82   qa->AddToHistogramsName("AnaCaloQA_");
83   qa->SetFidutialCut(fidCut);
84   qa->SwitchOnFidutialCut();
85   if(kPrintSettings) qa->Print("");     
86         
87   AliFidutialCut * fidCut1stYear = new AliFidutialCut();
88   fidCut1stYear->DoCTSFidutialCut(kFALSE) ;
89   fidCut1stYear->DoEMCALFidutialCut(kTRUE) ;
90   fidCut1stYear->DoPHOSFidutialCut(kTRUE) ;
91   fidCut1stYear->SetSimpleEMCALFidutialCut(0.7,80.,120.);
92   fidCut1stYear->SetSimplePHOSFidutialCut(0.12,260.,320.);
93         
94   AliAnaPhoton *anaphoton1 = new AliAnaPhoton();
95   anaphoton1->SetDebug(-1); //10 for lots of messages
96   //anaphoton->SetMinPt(0.5);
97   anaphoton1->SetMinDistanceToBadChannel(2, 4, 5);
98   anaphoton1->SetCaloPID(pid);
99   anaphoton1->SetCalorimeter(calorimeter);
100   if(kUseKinematics) anaphoton1->SwitchOnDataMC() ;//Access MC stack and fill more histograms
101   else  anaphoton1->SwitchOffDataMC() ;
102   anaphoton1->SwitchOffCaloPID();
103   anaphoton1->SwitchOffCaloPIDRecalculation(); //recommended for EMCAL
104   anaphoton1->SwitchOnFidutialCut();
105   anaphoton1->SetFidutialCut(fidCut1stYear);
106   anaphoton1->SetOutputAODName(Form("PhotonsForIM%s",calorimeter.Data()));
107   if(kPrintSettings) anaphoton1->Print("");
108
109   AliAnaPi0 *anapi0 = new AliAnaPi0();
110   anapi0->SetDebug(-1);//10 for lots of messages
111   anapi0->SetInputAODName(Form("PhotonsForIM%s",calorimeter.Data()));
112   anapi0->SetCaloPID(pid);
113   anapi0->SetCalorimeter(calorimeter);
114   anapi0->SwitchOnFidutialCut();
115   anapi0->SwitchOffDataMC() ;//Access MC stack and fill more histograms
116   if(kPrintSettings) anapi0->Print("");
117   
118         
119   // -------------------------------------------------
120   // --- Photon Isolation and Correlation Analysis ---
121   // -------------------------------------------------
122   
123   AliAnaPhoton *anaphoton2 = new AliAnaPhoton();
124   anaphoton2->SetDebug(-1); //10 for lots of messages
125   anaphoton2->SetMinPt(5);
126   anaphoton2->SetCaloPID(pid);
127   anaphoton2->SetCalorimeter(calorimeter);
128   if(kUseKinematics) anaphoton2->SwitchOnDataMC() ;//Access MC stack and fill more histograms
129   else  anaphoton2->SwitchOffDataMC() ;
130   anaphoton2->SwitchOnCaloPID();
131   if(calorimeter == "EMCAL") anaphoton2->SwitchOnCaloPIDRecalculation();
132   anaphoton2->SwitchOffFidutialCut();
133   anaphoton2->SetOutputAODName(Form("DirectPhotons%s",calorimeter.Data()));
134   anaphoton2->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
135   anaphoton2->AddToHistogramsName("AnaPhotonCorr_");
136   if(kPrintSettings) anaphoton2->Print("");
137   // ### Isolation analysis ### 
138   
139   AliIsolationCut * ic = new AliIsolationCut();
140   ic->SetConeSize(0.5);
141   ic->SetPtThreshold(1.);
142   ic->SetICMethod(AliIsolationCut::kPtThresIC);
143   if(kPrintSettings) ic->Print("");
144   
145   AliAnaParticleIsolation *anaisol = new AliAnaParticleIsolation();
146   anaisol->SetDebug(-1);
147   //anaisol->SetMinPt(5);
148   anaisol->SetInputAODName(Form("DirectPhotons%s",calorimeter.Data()));
149   anaisol->SetCalorimeter(calorimeter);
150   if(kUseKinematics) anaisol->SwitchOnDataMC() ;//Access MC stack and fill more histograms
151   else  anaisol->SwitchOffDataMC() ;
152   //Select clusters with no pair, if both clusters with pi0 mass
153   anaisol->SwitchOffInvariantMass();
154   //anaisol->SetNeutralMesonSelection(nms);
155   //Do isolation cut
156   anaisol->SetIsolationCut(ic); 
157   //Do or not do isolation with previously produced AODs.
158   //No effect if use of SwitchOnSeveralIsolation()
159   anaisol->SwitchOffReIsolation();
160   //Multiple IC
161   anaisol->SwitchOffSeveralIsolation() ;
162   if(kPrintSettings) anaisol->Print("");
163   
164   // ### Correlation with Jet Finder AOD output
165   AliAnaParticleJetFinderCorrelation *anacorrjet = new AliAnaParticleJetFinderCorrelation();
166   anacorrjet->SetInputAODName(Form("DirectPhotons%s",calorimeter.Data()));
167   anacorrjet->SwitchOffFidutialCut();
168   anacorrjet->SetDebug(-1);
169   anacorrjet->SetConeSize(1);  
170   anacorrjet->SelectIsolated(kTRUE); // do correlation with isolated photons
171   anacorrjet->SetPtThresholdInCone(0.2);
172   anacorrjet->SetDeltaPhiCutRange(0.5,5.5);//Mostly Open Cuts 
173   anacorrjet->SetRatioCutRange(0.01,3); //Mostly Open Cuts
174   anacorrjet->UseJetRefTracks(kFALSE); //Not working now
175   if(kPrintSettings) anacorrjet->Print("");
176   
177   // ### Correlation with hadrons
178   AliAnaParticleHadronCorrelation *anacorrhadron = new AliAnaParticleHadronCorrelation();
179   anacorrhadron->SetInputAODName(Form("DirectPhotons%s",calorimeter.Data()));
180   anacorrhadron->SetOutputAODName(Form("CorrelatedPi0s%s",calorimeter.Data()));
181   anacorrhadron->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
182   anacorrhadron->SetDebug(-1);
183   anacorrhadron->SwitchOffCaloPID();
184   anacorrhadron->SwitchOffFidutialCut();
185   anacorrhadron->SetPtCutRange(1,100);
186   anacorrhadron->SetDeltaPhiCutRange(1.5,4.5);
187   anacorrhadron->SelectIsolated(kTRUE); // do correlation with isolated photons
188   if(calorimeter=="PHOS"){
189     //Correlate with particles in EMCAL
190     anacorrhadron->SwitchOnCaloPID();
191     anacorrhadron->SwitchOnCaloPIDRecalculation(); //recommended for EMCAL
192   }
193   if(kPrintSettings) anacorrhadron->Print("");
194   
195   // #### Configure Maker ####
196   AliAnaPartCorrMaker * maker = new AliAnaPartCorrMaker();
197   maker->SetReader(reader);//pointer to reader
198   maker->AddAnalysis(qa,0);
199   maker->AddAnalysis(anaphoton1,1);
200   maker->AddAnalysis(anapi0,2);
201   maker->AddAnalysis(anaphoton2,3);
202   maker->AddAnalysis(anaisol,4);
203   maker->AddAnalysis(anacorrjet,5);
204   maker->AddAnalysis(anacorrhadron,6);
205   maker->SetAnaDebug(-1)  ;
206   maker->SwitchOnHistogramsMaker()  ;
207   maker->SwitchOnAODsMaker()  ;
208   if(kPrintSettings) maker->Print("");
209   
210   printf("======================== \n");
211   printf(" End Configuration of PartCorr analysis with detector %s \n",calorimeter.Data());
212   printf("======================== \n");
213   
214    // Create task
215    //===========================================================================
216   AliAnalysisTaskParticleCorrelation * task = new AliAnalysisTaskParticleCorrelation (Form("PartCorr%s",calorimeter.Data()));
217   task->SetConfigFileName(""); //Don't configure the analysis via configuration file.
218   //task->SetDebugLevel(-1);
219   task->SetAnalysisMaker(maker);                                
220   mgr->AddTask(task);
221   
222   char name[128];
223   sprintf(name,"PartCorr_%s",calorimeter.Data());
224   cout<<"Name of task "<<name<<endl;
225   //AliAnalysisDataContainer *cout_pc = mgr->CreateContainer(Form(name),TList::Class(),
226         //                                         AliAnalysisManager::kOutputContainer, Form("PartCorr_%s.root",calorimeter.Data()));
227   
228   TString outputfile = AliAnalysisManager::GetCommonFileName(); 
229   //  AliAnalysisDataContainer *cout_pc = mgr->CreateContainer(Form("PartCorr_%s",calorimeter.Data()),  TList::Class(), AliAnalysisManager::kOutputContainer, Form("%s:PartCorr_%s",outputfile.Data(),calorimeter.Data()));
230   AliAnalysisDataContainer *cout_pc = mgr->CreateContainer(calorimeter.Data(), TList::Class(), AliAnalysisManager::kOutputContainer, Form("%s:PartCorr",outputfile.Data()));
231
232   // Create ONLY the output containers for the data produced by the task.
233   // Get and connect other common input/output containers via the manager as below
234   //==============================================================================
235   mgr->ConnectInput  (task, 0, mgr->GetCommonInputContainer());
236   // AOD output slot will be used in a different way in future
237   mgr->ConnectOutput (task, 0, mgr->GetCommonOutputContainer());
238   mgr->ConnectOutput (task, 1, cout_pc);
239   
240   return task;
241 }
242
243