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