]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/SPECTRA/PiKaPr/TestAOD/AliAnalysisTaskSpectraAOD.cxx
Merge branch 'feature-movesplit'
[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 = dynamic_cast<AliAODTrack*>(fAOD->GetTrack(iTracks));
142     if(!track) AliFatal("Not a standard AOD");
143     if (!fTrackCuts->IsSelected(track,kTRUE)) continue;
144     
145     fPID->FillQAHistos(fHistMan, track, fTrackCuts);
146     
147     //calculate DCA for AOD track
148     Double_t dca=track->DCA();
149     if(dca==-999.){// track->DCA() does not work in old AOD production
150       Double_t d[2], covd[3];
151       AliAODTrack* track_clone=(AliAODTrack*)track->Clone("track_clone"); // need to clone because PropagateToDCA updates the track parameters
152       Bool_t isDCA = track_clone->PropagateToDCA(fAOD->GetPrimaryVertex(),fAOD->GetMagneticField(),9999.,d,covd);
153       delete track_clone;
154       if(!isDCA)d[0]=-999.;
155       dca=d[0];
156     }
157     fHistMan->GetPtHistogram(kHistPtRec)->Fill(track->Pt(),dca);  // PT histo
158     
159     // get identity and charge
160     Int_t idRec  = fPID->GetParticleSpecie(fHistMan,track, fTrackCuts);
161     
162     Int_t charge = track->Charge() > 0 ? kChPos : kChNeg;
163     
164     // Fill histograms, only if inside y and nsigma acceptance
165     if(idRec != kSpUndefined){
166       if(fTrackCuts->CheckYCut (mass[idRec]))fHistMan->GetHistogram2D(kHistPtRecSigma,idRec,charge)->Fill(track->Pt(),dca);
167     }//can't put a continue because we still have to fill allcharged primaries, done later
168     
169     /* MC Part */
170     if (arrayMC) {
171       AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel()));
172       if (!partMC) { 
173         AliError("Cannot get MC particle");
174         continue; 
175       }
176       // Check if it is primary, secondary from material or secondary from weak decay
177       Bool_t isPrimary           = partMC->IsPhysicalPrimary();
178       Bool_t isSecondaryMaterial = kFALSE; 
179       Bool_t isSecondaryWeak     = kFALSE; 
180       if(!isPrimary) {
181         Int_t mfl=-999,codemoth=-999;
182         Int_t indexMoth=partMC->GetMother(); // FIXME ignore fakes? TO BE CHECKED, on ESD is GetFirstMother()
183         if(indexMoth>=0){//is not fake
184           AliAODMCParticle* moth = (AliAODMCParticle*) arrayMC->At(indexMoth);
185           codemoth = TMath::Abs(moth->GetPdgCode());
186           mfl = Int_t (codemoth/ TMath::Power(10, Int_t(TMath::Log10(codemoth))));
187         }
188         //Int_t uniqueID = partMC->GetUniqueID();
189         //cout<<"uniqueID: "<<partMC->GetUniqueID()<<"       "<<kPDecay<<endl;
190         //cout<<"status: "<<partMC->GetStatus()<<"       "<<kPDecay<<endl;
191         // if(uniqueID == kPDecay)Printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
192         if(mfl==3) isSecondaryWeak     = kTRUE; // add if(partMC->GetStatus() & kPDecay)? FIXME
193         else       isSecondaryMaterial = kTRUE;
194       }
195       
196       if (isPrimary)fHistMan->GetPtHistogram(kHistPtRecPrimary)->Fill(track->Pt(),dca);  // PT histo of primaries
197       
198       //nsigma cut (reconstructed nsigma)
199       if(idRec == kSpUndefined) continue;
200       
201       // rapidity cut (reconstructed pt and identity)
202       if(!fTrackCuts->CheckYCut (mass[idRec])) continue;
203       
204       // Get true ID
205       Int_t idGen     = fPID->GetParticleSpecie(partMC);
206       //if(TMath::Abs(partMC->Y())   > fTrackCuts->GetY()  ) continue;      // FIXME: do we need a rapidity cut on the generated?
207       // Fill histograms for primaries
208       
209       if (idRec == idGen) fHistMan->GetHistogram2D(kHistPtRecTrue,  idGen, charge)->Fill(track->Pt(),dca); 
210       
211       if (isPrimary) {
212         fHistMan                    ->GetHistogram2D(kHistPtRecSigmaPrimary, idRec, charge)->Fill(track->Pt(),dca); 
213         if(idGen != kSpUndefined) {
214           fHistMan                    ->GetHistogram2D(kHistPtRecPrimary,      idGen, charge)->Fill(track->Pt(),dca);
215           if (idRec == idGen) fHistMan->GetHistogram2D(kHistPtRecTruePrimary,  idGen, charge)->Fill(track->Pt(),dca); 
216         }
217       }
218       //25th Apr - Muons are added to Pions -- FIXME
219       if ( partMC->PdgCode() == 13 && idRec == kSpPion) { 
220         fHistMan->GetPtHistogram(kHistPtRecTrueMuonPlus)->Fill(track->Pt(),dca); 
221         if(isPrimary)
222           fHistMan->GetPtHistogram(kHistPtRecTruePrimaryMuonPlus)->Fill(track->Pt(),dca); 
223       }
224       if ( partMC->PdgCode() == -13 && idRec == kSpPion) { 
225         fHistMan->GetPtHistogram(kHistPtRecTrueMuonMinus)->Fill(track->Pt(),dca); 
226         if (isPrimary) {
227           fHistMan->GetPtHistogram(kHistPtRecTruePrimaryMuonMinus)->Fill(track->Pt(),dca); 
228         }
229       }
230       
231       ///..... END FIXME
232       
233       // Fill secondaries
234       if(isSecondaryWeak    )  fHistMan->GetHistogram2D(kHistPtRecSigmaSecondaryWeakDecay, idRec, charge)->Fill(track->Pt(),dca);
235       if(isSecondaryMaterial)  fHistMan->GetHistogram2D(kHistPtRecSigmaSecondaryMaterial , idRec, charge)->Fill(track->Pt(),dca);
236       
237     }//end if(arrayMC)
238   } // end loop on tracks
239   
240   PostData(1, fHistMan  );
241   PostData(2, fEventCuts);
242   PostData(3, fTrackCuts);
243   PostData(4, fPID      );
244 }
245
246 //_________________________________________________________________
247 void   AliAnalysisTaskSpectraAOD::Terminate(Option_t *)
248 {
249   // Terminate
250 }