]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG2/SPECTRA/AliAnalysisTaskProtons.cxx
Code to combine and fit ID spectra (pi/K/p).
[u/mrichter/AliRoot.git] / PWG2 / SPECTRA / AliAnalysisTaskProtons.cxx
1 #include "Riostream.h"
2 #include "TStyle.h"
3 #include "TChain.h"
4 #include "TTree.h"
5 #include "TString.h"
6 #include "TList.h"
7 #include "TFile.h"
8 #include "TH2F.h"
9 #include "TH1F.h"
10 #include "TCanvas.h"
11
12 #include "AliAnalysisTask.h"
13 #include "AliAnalysisManager.h"
14
15 #include "AliESDEvent.h"
16 #include "AliESDInputHandler.h"
17 #include "AliAODEvent.h"
18 #include "AliAODInputHandler.h"
19 #include "AliMCEventHandler.h"
20 #include "AliMCEvent.h"
21 #include "AliStack.h"
22 #include "AliESDVertex.h"
23
24 #include "AliProtonAnalysis.h"
25 #include "AliProtonAnalysisBase.h"
26 #include "AliAnalysisTaskProtons.h"
27
28 //-----------------------------------------------------------------
29 //                 AliAnalysisTakProtons class
30 //   This is the task to run the \bar{p}/p analysis
31 //   Origin: Panos Christakoglou | Panos.Christakoglou@cern.ch
32 //-----------------------------------------------------------------
33
34 ClassImp(AliAnalysisTaskProtons)
35   
36 //________________________________________________________________________ 
37 AliAnalysisTaskProtons::AliAnalysisTaskProtons()
38   : AliAnalysisTask(), fESD(0), fAOD(0), fMC(0),
39     fListAnalysis(0), fListQA(0), fHistEventStats(0), 
40   fProtonAnalysis(0) {//, fCutCanvas(0) {
41   //Dummy constructor
42   
43 }
44
45 //________________________________________________________________________
46 AliAnalysisTaskProtons::AliAnalysisTaskProtons(const char *name) 
47   : AliAnalysisTask(name, ""), fESD(0), fAOD(0), fMC(0),
48     fListAnalysis(0), fListQA(0), fHistEventStats(0), 
49   fProtonAnalysis(0) {//, fCutCanvas(0) {
50   // Constructor
51   
52   // Define input and output slots here
53   // Input slot #0 works with a TChain
54   DefineInput(0, TChain::Class());
55   // Output slot #0 writes into a TList container
56   DefineOutput(0, TList::Class());
57   DefineOutput(1, TList::Class());
58   DefineOutput(2, TCanvas::Class());
59 }
60
61 //________________________________________________________________________
62 void AliAnalysisTaskProtons::ConnectInputData(Option_t *) {
63   // Connect ESD or AOD here
64   // Called once
65   TString gAnalysisLevel = dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetAnalysisLevel(); 
66
67   TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
68   if (!tree) {
69     Printf("ERROR: Could not read chain from input slot 0");
70   } else {
71     if(gAnalysisLevel == "ESD") {
72       AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
73      
74       if (!esdH) {
75         Printf("ERROR: Could not get ESDInputHandler");
76       } else
77         fESD = esdH->GetEvent();
78     }
79     else if(gAnalysisLevel == "AOD") {
80      AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
81      
82      if (!aodH) {
83        Printf("ERROR: Could not get AODInputHandler");
84      } else
85        fAOD = aodH->GetEvent();
86     }
87     else if(gAnalysisLevel == "MC") {
88      AliMCEventHandler* mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
89      if (!mcH) {
90        Printf("ERROR: Could not retrieve MC event handler");
91      }
92      else
93        fMC = mcH->MCEvent();
94     }
95     else
96       Printf("Wrong analysis type: Only ESD, AOD and MC types are allowed!");
97   }
98 }
99
100 //________________________________________________________________________
101 void AliAnalysisTaskProtons::CreateOutputObjects() {
102   // Create output objects
103   // Called once
104   char *gCutName[5] = {"Total","Triggered","Offline trigger",
105                        "Vertex","Analyzed"};
106   fHistEventStats = new TH1F("fHistEventStats",
107                              "Event statistics;;N_{events}",
108                              5,0.5,5.5);
109   for(Int_t i = 1; i <= 5; i++) 
110     fHistEventStats->GetXaxis()->SetBinLabel(i,gCutName[i-1]);
111
112   fListAnalysis = new TList();
113   fListAnalysis->Add(fProtonAnalysis->GetProtonYPtHistogram());
114   fListAnalysis->Add(fProtonAnalysis->GetAntiProtonYPtHistogram());
115   fListAnalysis->Add(fProtonAnalysis->GetEventHistogram());
116   fListAnalysis->Add(fProtonAnalysis->GetProtonContainer());
117   fListAnalysis->Add(fProtonAnalysis->GetAntiProtonContainer());
118   fListAnalysis->Add(fHistEventStats);
119
120   //fListQA = new TList();
121   //fListQA->SetName("fListQA");
122   //fListQA->Add(fProtonAnalysis->GetQAList());
123   //fListQA->Add(dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVertexQAList());
124
125   //fCutCanvas = dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetListOfCuts();
126 }
127
128 //________________________________________________________________________
129 void AliAnalysisTaskProtons::Exec(Option_t *) {
130   // Main loop
131   // Called for each event
132   TString gAnalysisLevel = dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetAnalysisLevel(); 
133   
134   if(gAnalysisLevel == "ESD") {
135     if (!fESD) {
136       Printf("ERROR: fESD not available");
137       return;
138     }
139     
140     fHistEventStats->Fill(1);
141     if(dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->IsOnlineTriggerUsed()) {
142       //online trigger
143       if(dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->IsEventTriggered(fESD,dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetTriggerMode())) {
144         fHistEventStats->Fill(2);
145         AliDebug(1,Form("Fired trigger class: %s",fESD->GetFiredTriggerClasses().Data()));
146         
147         //offline trigger
148         if(dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->IsOfflineTriggerUsed()) {
149           AliPhysicsSelection *gPhysicselection = dynamic_cast<AliPhysicsSelection *>(dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetPhysicsSelectionObject());
150           if(gPhysicselection->IsCollisionCandidate(fESD)) {
151             fHistEventStats->Fill(3);
152             AliDebug(1,Form("Fired trigger class: %s",fESD->GetFiredTriggerClasses().Data()));
153             //Reconstructed vertex
154             const AliESDVertex *vertex = dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVertex(fESD,dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetAnalysisMode(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVxMax(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVyMax(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVzMax());
155             fHistEventStats->Fill(4);
156             if(vertex) {
157               AliDebug(1,Form("Proton ESD analysis task: There are %d tracks in this event",fESD->GetNumberOfTracks()));
158               fProtonAnalysis->Analyze(fESD,vertex);
159               fHistEventStats->Fill(5);
160             }//reconstructed vertex
161           }//offline trigger
162         }//usage of the offline trigger
163         else {
164           fHistEventStats->Fill(3);
165           AliDebug(1,Form("Fired trigger class: %s",fESD->GetFiredTriggerClasses().Data()));
166           //Reconstructed vertex
167           const AliESDVertex *vertex = dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVertex(fESD,dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetAnalysisMode(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVxMax(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVyMax(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVzMax());
168           fHistEventStats->Fill(4);
169           if(vertex) {
170             AliDebug(1,Form("Proton ESD analysis task: There are %d tracks in this event",fESD->GetNumberOfTracks()));
171             fProtonAnalysis->Analyze(fESD,vertex);
172             fHistEventStats->Fill(5);
173             }//reconstructed vertex
174         }//offline trigger not used
175       }//triggered event - online
176     }//online trigger used
177     else {
178       fHistEventStats->Fill(2);
179       AliDebug(1,Form("Fired trigger class: %s",fESD->GetFiredTriggerClasses().Data()));
180       
181       //offline trigger
182       if(dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->IsOfflineTriggerUsed()) {
183         AliPhysicsSelection *gPhysicselection = dynamic_cast<AliPhysicsSelection *>(dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetPhysicsSelectionObject());
184         if(gPhysicselection->IsCollisionCandidate(fESD)) {
185           fHistEventStats->Fill(3);
186           AliDebug(1,Form("Fired trigger class: %s",fESD->GetFiredTriggerClasses().Data()));
187           //Reconstructed vertex
188           const AliESDVertex *vertex = dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVertex(fESD,dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetAnalysisMode(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVxMax(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVyMax(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVzMax());
189           fHistEventStats->Fill(4);
190           if(vertex) {
191             AliDebug(1,Form("Proton ESD analysis task: There are %d tracks in this event",fESD->GetNumberOfTracks()));
192             fProtonAnalysis->Analyze(fESD,vertex);
193             fHistEventStats->Fill(5);
194           }//reconstructed vertex
195         }//offline trigger
196       }//usage of the offline trigger
197       else {
198         fHistEventStats->Fill(3);
199         AliDebug(1,Form("Fired trigger class: %s",fESD->GetFiredTriggerClasses().Data()));
200         //Reconstructed vertex
201         const AliESDVertex *vertex = dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVertex(fESD,dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetAnalysisMode(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVxMax(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVyMax(),dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetVzMax());
202         fHistEventStats->Fill(4);
203         if(vertex) {
204           AliDebug(1,Form("Proton ESD analysis task: There are %d tracks in this event",fESD->GetNumberOfTracks()));
205           fProtonAnalysis->Analyze(fESD,vertex);
206           fHistEventStats->Fill(5);
207         }//reconstructed vertex
208       }//offline trigger not used
209     }//online trigger not used
210   }//ESD analysis              
211   
212   else if(gAnalysisLevel == "AOD") {
213     if (!fAOD) {
214       Printf("ERROR: fAOD not available");
215       return;
216     }
217     AliDebug(1,Form("Proton AOD analysis task: There are %d tracks in this event", fAOD->GetNumberOfTracks()));
218     //Printf("Proton AOD analysis task: There are %d tracks in this event", fAOD->GetNumberOfTracks());
219     fProtonAnalysis->Analyze(fAOD);
220   }//AOD analysis
221   
222   else if(gAnalysisLevel == "MC") {
223     if (!fMC) {
224       Printf("ERROR: Could not retrieve MC event");
225       return;
226     }
227
228     AliStack* stack = fMC->Stack();
229     if (!stack) {
230       Printf("ERROR: Could not retrieve the stack");
231       return;
232     }
233     AliDebug(1,Form("Proton MC analysis task: There are %d primaries in this event", stack->GetNprimary()));
234     //Printf("Proton MC analysis task: There are %d primaries in this event", stack->GetNprimary());
235     fProtonAnalysis->Analyze(stack,kFALSE);//kTRUE in case of inclusive measurement
236   }//MC analysis                      
237
238   // Post output data.
239   PostData(0, fListAnalysis);
240   //PostData(1, fListQA);
241   //PostData(2, fCutCanvas);
242 }      
243
244 //________________________________________________________________________
245 void AliAnalysisTaskProtons::Terminate(Option_t *) {
246   // Draw result to the screen
247   // Called once at the end of the query
248   gStyle->SetPalette(1,0);
249
250   fListAnalysis = dynamic_cast<TList*> (GetOutputData(0));
251   if (!fListAnalysis) {
252     Printf("ERROR: fListAnalysis not available");
253     return;
254   }
255    
256   TH2F *fHistYPtProtons = (TH2F *)fListAnalysis->At(0);
257   TH2F *fHistYPtAntiProtons = (TH2F *)fListAnalysis->At(1);
258     
259   TCanvas *c1 = new TCanvas("c1","p-\bar{p}",200,0,800,400);
260   c1->SetFillColor(10); c1->SetHighLightColor(10); c1->Divide(2,1);
261
262   c1->cd(1)->SetLeftMargin(0.15); c1->cd(1)->SetBottomMargin(0.15);  
263   if (fHistYPtProtons) fHistYPtProtons->DrawCopy("colz");
264   c1->cd(2)->SetLeftMargin(0.15); c1->cd(2)->SetBottomMargin(0.15);  
265   if (fHistYPtAntiProtons) fHistYPtAntiProtons->DrawCopy("colz");
266
267   /*TCanvas *c2 = dynamic_cast<AliProtonAnalysisBase*>(fProtonAnalysis->GetProtonAnalysisBaseObject())->GetListOfCuts();
268   TFile *flocal = TFile::Open("ListOfCuts.root","recreate");
269   c2->Write();
270   flocal->Close();*/
271 }
272