Minor fix for software triggers.
[u/mrichter/AliRoot.git] / PWG3 / base / AliAnalysisTaskPtMothFromPtDaugh.cxx
CommitLineData
c4df3c2a 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// Class AnalysisTaskAliPtMothFromPtDaugh //
18// AnalysisTaskSE used for the reconstruction of mothers particles //
19// spectra (pT and pTMin) starting from the pT-spectra of //
20// daughters particles. //
21// //
22// Authors: Giuseppe Bruno & Fiorella Fionda //
23// //
24//////////////////////////////////////////////////////////////////////////
25
26#include <TChain.h>
27
28#include "AliAnalysisManager.h"
29#include "AliMCEventHandler.h"
30#include "AliMCEvent.h"
31#include "AliStack.h"
32#include "TNtuple.h"
33#include "TH1F.h"
34#include "TFile.h"
35#include "AliLog.h"
36#include "AliAnalysisTaskPtMothFromPtDaugh.h"
37#include "AliPtMothFromPtDaugh.h"
38#include "AliAnalysisTaskSE.h"
39
40ClassImp(AliAnalysisTaskPtMothFromPtDaugh)
41
42//_________________________________________________________________________________
43AliAnalysisTaskPtMothFromPtDaugh::AliAnalysisTaskPtMothFromPtDaugh() :
44 AliAnalysisTaskSE(),
45 fPtMothDaugh(0),
46 fDecayKine(0),
47 fReadKineFromNtupla(0),
48 fFileNtuplaName(0),
49 fList(0)
50{
51 //
52 // Default Constructor
53 //
54 AliInfo("Default Constructor!\n");
55}
56
57//_________________________________________________________________________________
58AliAnalysisTaskPtMothFromPtDaugh::AliAnalysisTaskPtMothFromPtDaugh(Bool_t IsNtuplaCreated) :
59 AliAnalysisTaskSE("TaskAliPtMothFromDaugh"),
60 fPtMothDaugh(0),
61 fDecayKine(0),
62 fReadKineFromNtupla(IsNtuplaCreated),
63 fFileNtuplaName(0),
64 fList(0)
65{
66 //
67 // Basic AnalysisTaskSE Constructor
68 // Basic input of the analysis: TChain of galice.root files (optional)
69 // Basic ouput: TList of mothers histograms (pT and pTMin) (standard)
70 // TNtupla with kinematics informations of mothers
71 // and daughters (optional)
72 // If Ntupla already exists loop on kinematics is not needed
73 // therefore input is not defined
74 //
75 if(!IsNtuplaCreated){
76 DefineInput(0,TChain::Class()); DefineOutput(2,TNtuple::Class());}
77 else {AliInfo("Ntupla is already created! Loop on events is skipped!\n");}
78 DefineOutput(1,TList::Class());
79}
80
81//___________________________________________________________________________________
82AliAnalysisTaskPtMothFromPtDaugh::~AliAnalysisTaskPtMothFromPtDaugh()
83 {
84 //
85 // Destructor
86 //
87 if(fPtMothDaugh)
88 { delete fPtMothDaugh; fPtMothDaugh=0;}
89 if(fDecayKine)
90 { delete fDecayKine; fDecayKine=0;}
91 if(fFileNtuplaName)
92 { delete fFileNtuplaName; fFileNtuplaName=0;}
93 if (fList)
94 { delete fList; fList = 0; }
95 }
96
97
98
99//_________________________________________________________________________________
100void AliAnalysisTaskPtMothFromPtDaugh::UserCreateOutputObjects()
101{
102 //
103 // Initialise the framework objects
104 //
105 //
106 // Initialise the framework objects. OutPut objects created are:
107 // 1) TList with mothers histograms
108 // 2) TNtuple with kinematics informations of mothers and daughters (optional)
109 //
110 fList = new TList();
111 fList->SetOwner();
112 if(fReadKineFromNtupla) return;
113
114 if(!AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()) {
115 Fatal("UserCreateOutputObjects", "This task needs a MC handler");
116 return;
117 }
118 fDecayKine=new TNtuple("DecayKine","Decay kinematics","pdgM:pxM:pyM:pzM:yM:etaM:pdgD:pxD:pyD:pzD:yD:etaD");
119 return;
120}
121
122//_________________________________________________________________________________
123void AliAnalysisTaskPtMothFromPtDaugh::UserExec(Option_t */*option*/)
124{
125 //
126 // Main loop. Called for every event
127 // This loop fill a TNtuple with kinematics informations for
128 // mother and daughter particles. TNtupla contains:
129 // pdg of Mothers
130 // px "
131 // py "
132 // pz "
133 // rapidity "
134 // eta "
135 // pdg of Daughter
136 // px "
137 // py "
138 // pz "
139 // rapidity "
140 // eta "
141 //
142 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
143 if(!mcHandler) {AliError("Could not get MC event handler!"); return; }
144 mcHandler->SetReadTR(kFALSE);
145 AliMCEvent* mcEvent = mcHandler->MCEvent();
146 if(!mcEvent){ AliError("Could not get MC event!"); return; }
147 AliStack* stack = mcEvent->Stack();
148 if(!stack){ AliError("Could not get stack!"); return; }
149 Int_t nPrims = stack->GetNprimary();
150 float *inf = new float[12];
151 for (Int_t iTrack = 0; iTrack < nPrims; ++iTrack) {
152 TParticle *part = stack->Particle(iTrack);
153 Int_t pdg=TMath::Abs(part->GetPdgCode());
154 Double_t y,y2;
155 //check if particle is in mothers list
156 Int_t labelDaugh;
157 if(fPtMothDaugh->IsMothers(pdg))
158 {
159 //check if mother particle has a selected daugh
160 if(!fPtMothDaugh->IsSelectedDaugh(part,labelDaugh,stack)) continue;
161 TParticle *pDaugh=stack->Particle(labelDaugh);
162 fPtMothDaugh->Rapidity(part,y);
163 fPtMothDaugh->Rapidity(pDaugh,y2);
164
165 inf[0]=part->GetPdgCode();
166 inf[1]=part->Px();
167 inf[2]=part->Py();
168 inf[3]=part->Pz();
169 inf[4]=y;
170 inf[5]=part->Eta();
171 inf[6]=pDaugh->GetPdgCode();
172 inf[7]=pDaugh->Px();
173 inf[8]=pDaugh->Py();
174 inf[9]=pDaugh->Pz();
175 inf[10]=y2;
176 inf[11]=pDaugh->Eta();
177 fDecayKine->Fill(inf);
178 } //close if statement for mothers particles
179 } //end of tracks loop
180 PostData(2,fDecayKine);
181 PostData(1,fList);
182 return;
183}
184
185//___________________________________________________________________________________
186void AliAnalysisTaskPtMothFromPtDaugh::Terminate(Option_t */*option*/)
187 {
188 //
189 // Terminate method called at the end of the events loop.
190 // Get the Ntupla with kineamtics informations after the
191 // events loop or read it from the file fFileNtuplaName
192 // if the Ntupla is already created. Then use it to
193 // evaluate pT and pTMin spectra for mothers by means
194 // of the method implemented in AliPtMothFromPtDaugh
195 //
196 if(fReadKineFromNtupla) fDecayKine = ReadNtuplaFromFile(fFileNtuplaName);
197 else{
198 fDecayKine = dynamic_cast<TNtuple*>(GetOutputData(2));
199 fList = dynamic_cast<TList*>(GetOutputData(1));
200 }
201 if(!fDecayKine) { AliInfo("TNtupla not available!\n"); return; }
202 if(!fList) { AliInfo("TList not availble!\n"); return; }
203 fPtMothDaugh->SetDecayNtupla(fDecayKine);
204 fPtMothDaugh->EvaluatePtMoth();
205 TH1F *fHistoPt = (TH1F*)fPtMothDaugh->GetHistoPtMother()->Clone();
206 TH1F *fHistoPtMin = (TH1F*)fPtMothDaugh->GetHistoPtMinMother()->Clone();
207 fList->Add(fHistoPt);
208 fList->Add(fHistoPtMin);
209 PostData(1,fList);
210 return;
211 }
212
213//___________________________________________________________________________________
214TNtuple *AliAnalysisTaskPtMothFromPtDaugh::ReadNtuplaFromFile(char *inFileName)
215 {
216 //
217 // Get Ntupla from the file inFileName
218 // after the it is created.
219 // Input: name of the file - Output: TNtupla
220 //
221 TFile *f = new TFile(inFileName,"READ");
222 if(!f) {AliError(Form("File %s with TNtupla doesn't exist!",inFileName)); return 0x0;}
223 TNtuple *DecayKine=(TNtuple*)f->Get("DecayKine");
224 if(!DecayKine) { AliError("The TNtupla doesn't exist!\n"); return 0x0;}
225 return DecayKine;
226 }