]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/SPECTRA/PiKaPr/TestAOD/AliAnalysisTaskSpectraAOD.cxx
AliPIDCombined not transient + AddTaskSpectraAllChAOD modification
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / PiKaPr / TestAOD / AliAnalysisTaskSpectraAOD.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 //-----------------------------------------------------------------
17 //         AliAnalysisTaskSpectraAOD class
18 //-----------------------------------------------------------------
19
20 #include "TChain.h"
21 #include "TTree.h"
22 #include "TLegend.h"
23 #include "TH1F.h"
24 #include "TH2F.h"
25 #include "TCanvas.h"
26 #include "AliAnalysisTask.h"
27 #include "AliAnalysisManager.h"
28 #include "AliAODTrack.h"
29 #include "AliAODMCParticle.h"
30 #include "AliVParticle.h"
31 #include "AliAODEvent.h"
32 #include "AliAODInputHandler.h"
33 #include "AliAnalysisTaskSpectraAOD.h"
34 #include "AliAnalysisTaskESDfilter.h"
35 #include "AliAnalysisDataContainer.h"
36 #include "AliSpectraAODHistoManager.h"
37 #include "AliSpectraAODTrackCuts.h"
38 #include "AliSpectraAODEventCuts.h"
39 #include "AliCentrality.h"
40 #include "TProof.h"
41 #include "AliPID.h"
42 #include "AliVEvent.h"
43 #include "AliPIDResponse.h"
44 #include "AliStack.h"
45 #include "AliSpectraAODPID.h"
46 #include <TMCProcess.h>
47
48 #include <iostream>
49
50
51
52
53 using namespace AliSpectraNameSpace;
54 using namespace std;
55
56 ClassImp(AliAnalysisTaskSpectraAOD) // EX1 This stuff tells root to implement the streamer, inspector methods etc (we discussed about it today)
57
58 //________________________________________________________________________
59 AliAnalysisTaskSpectraAOD::AliAnalysisTaskSpectraAOD(const char *name) : AliAnalysisTaskSE(name), fAOD(0), fHistMan(0), fTrackCuts(0), fEventCuts(0),  fPID(0), fIsMC(0), fNRebin(0)
60 {
61   // Default constructor
62   
63   DefineInput(0, TChain::Class());
64   DefineOutput(1, AliSpectraAODHistoManager::Class());
65   DefineOutput(2, AliSpectraAODEventCuts::Class());
66   DefineOutput(3, AliSpectraAODTrackCuts::Class());
67   DefineOutput(4, AliSpectraAODPID::Class());
68   fNRebin=0;
69   
70 }
71 //________________________________________________________________________
72 //________________________________________________________________________
73 void AliAnalysisTaskSpectraAOD::UserCreateOutputObjects()
74 {
75   // create output objects
76   fHistMan = new AliSpectraAODHistoManager("SpectraHistos",fNRebin);
77
78   if (!fTrackCuts) AliFatal("Track Cuts should be set in the steering macro");
79   if (!fEventCuts) AliFatal("Event Cuts should be set in the steering macro");
80   if (!fPID)       AliFatal("PID object should be set in the steering macro");
81
82   PostData(1, fHistMan  );
83   PostData(2, fEventCuts);
84   PostData(3, fTrackCuts);
85   PostData(4, fPID      );
86
87 }
88 //________________________________________________________________________
89 void AliAnalysisTaskSpectraAOD::UserExec(Option_t *)
90 {
91   // main event loop
92   //Printf("ALIVE");
93   fAOD = dynamic_cast<AliAODEvent*>(fInputEvent);
94   if (!fAOD) {
95     AliWarning("ERROR: AliAODEvent not available \n");
96     return;
97   }
98   
99   if (strcmp(fAOD->ClassName(), "AliAODEvent"))
100     {
101       AliFatal("Not processing AODs");
102     }
103   
104   if(!fEventCuts->IsSelected(fAOD,fTrackCuts))return;//event selection
105   
106   //AliCentrality fAliCentral*;
107   //   if ((fAOD->GetCentrality())->GetCentralityPercentile("V0M") > 5.) return;
108   
109   // First do MC to fill up the MC particle array, such that we can use it later
110   TClonesArray *arrayMC = 0;
111   if (fIsMC)
112     {
113       arrayMC = (TClonesArray*) fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());
114       if (!arrayMC) {
115         AliFatal("Error: MC particles branch not found!\n");
116       }
117       Int_t nMC = arrayMC->GetEntries();
118       for (Int_t iMC = 0; iMC < nMC; iMC++)
119         {
120           AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(iMC);
121           if(!partMC->Charge()) continue;//Skip neutrals
122           //if(partMC->Eta() > fTrackCuts->GetEtaMin() && partMC->Eta() < fTrackCuts->GetEtaMax()){//charged hadron are filled inside the eta acceptance
123           //Printf("%f     %f-%f",partMC->Eta(),fTrackCuts->GetEtaMin(),fTrackCuts->GetEtaMax());
124           if(partMC->Eta() < fTrackCuts->GetEtaMin() || partMC->Eta() > fTrackCuts->GetEtaMax())continue;//ETA CUT ON GENERATED!!!!!!!!!!!!!!!!!!!!!!!!!!
125           fHistMan->GetPtHistogram(kHistPtGen)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary());
126           
127           //rapidity cut
128           if(TMath::Abs(partMC->Y())   > fTrackCuts->GetY()  ) continue;            
129           // check for true PID + and fill P_t histos 
130           Int_t charge = partMC->Charge() > 0 ? kChPos : kChNeg ;
131           Int_t id = fPID->GetParticleSpecie(partMC);
132           if(id != kSpUndefined) {
133             fHistMan->GetHistogram2D(kHistPtGenTruePrimary,id,charge)->Fill(partMC->Pt(),partMC->IsPhysicalPrimary());
134           }
135         }
136     }
137   
138   Double_t mass[3]={1.39570000000000000e-01,4.93676999999999977e-01,9.38271999999999995e-01};//FIXME masses to be taken from AliHelperPID
139   //main loop on tracks
140   for (Int_t iTracks = 0; iTracks < fAOD->GetNumberOfTracks(); iTracks++) {
141     AliAODTrack* track = fAOD->GetTrack(iTracks);
142     if (!fTrackCuts->IsSelected(track,kTRUE)) continue;
143     
144     fPID->FillQAHistos(fHistMan, track, fTrackCuts);
145     
146     //calculate DCA for AOD track
147     Double_t dca=track->DCA();
148     if(dca==-999.){// track->DCA() does not work in old AOD production
149       Double_t d[2], covd[3];
150       AliAODTrack* track_clone=(AliAODTrack*)track->Clone("track_clone"); // need to clone because PropagateToDCA updates the track parameters
151       Bool_t isDCA = track_clone->PropagateToDCA(fAOD->GetPrimaryVertex(),fAOD->GetMagneticField(),9999.,d,covd);
152       delete track_clone;
153       if(!isDCA)d[0]=-999.;
154       dca=d[0];
155     }
156     fHistMan->GetPtHistogram(kHistPtRec)->Fill(track->Pt(),dca);  // PT histo
157     
158     // get identity and charge
159     Int_t idRec  = fPID->GetParticleSpecie(fHistMan,track, fTrackCuts);
160     
161     Int_t charge = track->Charge() > 0 ? kChPos : kChNeg;
162     
163     // Fill histograms, only if inside y and nsigma acceptance
164     if(idRec != kSpUndefined){
165       if(fTrackCuts->CheckYCut (mass[idRec]))fHistMan->GetHistogram2D(kHistPtRecSigma,idRec,charge)->Fill(track->Pt(),dca);
166     }//can't put a continue because we still have to fill allcharged primaries, done later
167     
168     /* MC Part */
169     if (arrayMC) {
170       AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel()));
171       if (!partMC) { 
172         AliError("Cannot get MC particle");
173         continue; 
174       }
175       // Check if it is primary, secondary from material or secondary from weak decay
176       Bool_t isPrimary           = partMC->IsPhysicalPrimary();
177       Bool_t isSecondaryMaterial = kFALSE; 
178       Bool_t isSecondaryWeak     = kFALSE; 
179       if(!isPrimary) {
180         Int_t mfl=-999,codemoth=-999;
181         Int_t indexMoth=partMC->GetMother(); // FIXME ignore fakes? TO BE CHECKED, on ESD is GetFirstMother()
182         if(indexMoth>=0){//is not fake
183           AliAODMCParticle* moth = (AliAODMCParticle*) arrayMC->At(indexMoth);
184           codemoth = TMath::Abs(moth->GetPdgCode());
185           mfl = Int_t (codemoth/ TMath::Power(10, Int_t(TMath::Log10(codemoth))));
186         }
187         //Int_t uniqueID = partMC->GetUniqueID();
188         //cout<<"uniqueID: "<<partMC->GetUniqueID()<<"       "<<kPDecay<<endl;
189         //cout<<"status: "<<partMC->GetStatus()<<"       "<<kPDecay<<endl;
190         // if(uniqueID == kPDecay)Printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
191         if(mfl==3) isSecondaryWeak     = kTRUE; // add if(partMC->GetStatus() & kPDecay)? FIXME
192         else       isSecondaryMaterial = kTRUE;
193       }
194       
195       if (isPrimary)fHistMan->GetPtHistogram(kHistPtRecPrimary)->Fill(track->Pt(),dca);  // PT histo of primaries
196       
197       //nsigma cut (reconstructed nsigma)
198       if(idRec == kSpUndefined) continue;
199       
200       // rapidity cut (reconstructed pt and identity)
201       if(!fTrackCuts->CheckYCut (mass[idRec])) continue;
202       
203       // Get true ID
204       Int_t idGen     = fPID->GetParticleSpecie(partMC);
205       //if(TMath::Abs(partMC->Y())   > fTrackCuts->GetY()  ) continue;      // FIXME: do we need a rapidity cut on the generated?
206       // Fill histograms for primaries
207       
208       if (idRec == idGen) fHistMan->GetHistogram2D(kHistPtRecTrue,  idGen, charge)->Fill(track->Pt(),dca); 
209       
210       if (isPrimary) {
211         fHistMan                    ->GetHistogram2D(kHistPtRecSigmaPrimary, idRec, charge)->Fill(track->Pt(),dca); 
212         if(idGen != kSpUndefined) {
213           fHistMan                    ->GetHistogram2D(kHistPtRecPrimary,      idGen, charge)->Fill(track->Pt(),dca);
214           if (idRec == idGen) fHistMan->GetHistogram2D(kHistPtRecTruePrimary,  idGen, charge)->Fill(track->Pt(),dca); 
215         }
216       }
217       //25th Apr - Muons are added to Pions -- FIXME
218       if ( partMC->PdgCode() == 13 && idRec == kSpPion) { 
219         fHistMan->GetPtHistogram(kHistPtRecTrueMuonPlus)->Fill(track->Pt(),dca); 
220         if(isPrimary)
221           fHistMan->GetPtHistogram(kHistPtRecTruePrimaryMuonPlus)->Fill(track->Pt(),dca); 
222       }
223       if ( partMC->PdgCode() == -13 && idRec == kSpPion) { 
224         fHistMan->GetPtHistogram(kHistPtRecTrueMuonMinus)->Fill(track->Pt(),dca); 
225         if (isPrimary) {
226           fHistMan->GetPtHistogram(kHistPtRecTruePrimaryMuonMinus)->Fill(track->Pt(),dca); 
227         }
228       }
229       
230       ///..... END FIXME
231       
232       // Fill secondaries
233       if(isSecondaryWeak    )  fHistMan->GetHistogram2D(kHistPtRecSigmaSecondaryWeakDecay, idRec, charge)->Fill(track->Pt(),dca);
234       if(isSecondaryMaterial)  fHistMan->GetHistogram2D(kHistPtRecSigmaSecondaryMaterial , idRec, charge)->Fill(track->Pt(),dca);
235       
236     }//end if(arrayMC)
237   } // end loop on tracks
238   
239   PostData(1, fHistMan  );
240   PostData(2, fEventCuts);
241   PostData(3, fTrackCuts);
242   PostData(4, fPID      );
243 }
244
245 //_________________________________________________________________
246 void   AliAnalysisTaskSpectraAOD::Terminate(Option_t *)
247 {
248   // Terminate
249 }