]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG3/vertexingHF/AliAnalysisTaskSESelectHF.cxx
Update (Andrea)
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliAnalysisTaskSESelectHF.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2008, 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 /* $Id$ */
17
18 /////////////////////////////////////////////////////////////
19 //
20 // AliAnalysisTaskSE for the selection of heavy flavor
21 // decay candidates and creation a stand-alone AOD.
22 //
23 // Author: A.Dainese, andrea.dainese@lnl.infn.it
24 /////////////////////////////////////////////////////////////
25
26 #include <TClonesArray.h>
27
28 #include "AliAnalysisManager.h"
29 #include "AliAODHandler.h"
30 #include "AliAODEvent.h"
31 #include "AliAODVertex.h"
32 #include "AliAODTrack.h"
33 #include "AliAODRecoDecayHF2Prong.h"
34 #include "AliAnalysisVertexingHF.h"
35 #include "AliAnalysisTaskSE.h"
36 #include "AliAnalysisTaskSESelectHF.h"
37
38 ClassImp(AliAnalysisTaskSESelectHF)
39
40
41 //________________________________________________________________________
42 AliAnalysisTaskSESelectHF::AliAnalysisTaskSESelectHF():
43 AliAnalysisTaskSE(),
44 fVerticesHFTClArr(0),
45 fD0toKpiTClArr(0),
46 fVHF(0)
47 {
48   // Default constructor
49 }
50
51 //________________________________________________________________________
52 AliAnalysisTaskSESelectHF::AliAnalysisTaskSESelectHF(const char *name):
53 AliAnalysisTaskSE(name),
54 fVerticesHFTClArr(0),
55 fD0toKpiTClArr(0),
56 fVHF(0)
57 {
58   // Default constructor
59 }
60
61 //________________________________________________________________________
62 AliAnalysisTaskSESelectHF::~AliAnalysisTaskSESelectHF()
63 {
64   // Destructor
65
66   if (fVHF) {
67     delete fVHF;
68     fVHF = 0;
69   }
70
71 }  
72
73 //________________________________________________________________________
74 void AliAnalysisTaskSESelectHF::Init()
75 {
76   // Initialization
77
78   if(fDebug > 1) printf("AnalysisTaskSESelectHF::Init() \n");
79
80   gROOT->LoadMacro("ConfigVertexingHF.C");
81
82   fVHF = (AliAnalysisVertexingHF*)gROOT->ProcessLine("ConfigVertexingHF()");  
83   fVHF->PrintStatus();
84
85   return;
86 }
87
88 //________________________________________________________________________
89 void AliAnalysisTaskSESelectHF::UserCreateOutputObjects()
90 {
91   // Create the output container
92   //
93   if(fDebug > 1) printf("AnalysisTaskSESelectHF::UserCreateOutputObjects() \n");
94
95   fVerticesHFTClArr = new TClonesArray("AliAODVertex", 0);
96   fVerticesHFTClArr->SetName("VerticesHF");
97   AddAODBranch("TClonesArray", &fVerticesHFTClArr);
98
99   fD0toKpiTClArr = new TClonesArray("AliAODRecoDecayHF2Prong", 0);
100   fD0toKpiTClArr->SetName("D0toKpi");
101   AddAODBranch("TClonesArray", &fD0toKpiTClArr);
102
103   return;
104 }
105
106 //________________________________________________________________________
107 void AliAnalysisTaskSESelectHF::UserExec(Option_t */*option*/)
108 {
109   // Execute analysis for current event:
110   // heavy flavor candidates selection and histograms
111   
112   AliAODEvent *aodIn = dynamic_cast<AliAODEvent*> (InputEvent());
113
114   TClonesArray *inputArrayD0toKpi = 0;
115
116   if(!aodIn && AODEvent() && IsStandardAOD()) {
117     // In case there is an AOD handler writing a standard AOD, use the AOD 
118     // event in memory rather than the input (ESD) event.    
119     aodIn = dynamic_cast<AliAODEvent*> (AODEvent());
120     // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
121     // have to taken from the AOD event hold by the AliAODExtension
122     AliAODHandler* aodHandler = (AliAODHandler*) 
123       ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
124     if(aodHandler->GetExtensions()) {
125       AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
126       AliAODEvent *aodFromExt = ext->GetAOD();
127       // load D0 candidates                                                   
128       inputArrayD0toKpi=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
129     }
130   } else if(aodIn) {
131     // load D0 candidates                                                   
132     inputArrayD0toKpi=(TClonesArray*)aodIn->GetList()->FindObject("D0toKpi");
133   }
134
135   if(!inputArrayD0toKpi || !aodIn) {
136     printf("AliAnalysisTaskSESelectHF::UserExec: D0toKpi branch not found!\n");
137     return;
138   }
139
140   //print event info
141   //aodIn->GetHeader()->Print();
142   
143   // primary vertex
144   AliAODVertex *vtx1 = (AliAODVertex*)aodIn->GetPrimaryVertex();
145   //vtx1->Print();
146     
147   // make trkIDtoEntry register (temporary)
148   Int_t trkIDtoEntry[100000];
149   for(Int_t it=0;it<aodIn->GetNumberOfTracks();it++) {
150     AliAODTrack *track = aodIn->GetTrack(it);
151     trkIDtoEntry[track->GetID()]=it;
152   }
153
154   Int_t iOutVerticesHF=0,iOutD0toKpi=0;
155   fVerticesHFTClArr->Delete();
156   iOutVerticesHF = fVerticesHFTClArr->GetEntriesFast();
157   TClonesArray &verticesHFRef = *fVerticesHFTClArr;
158   fD0toKpiTClArr->Delete();
159   iOutD0toKpi = fD0toKpiTClArr->GetEntriesFast();
160   TClonesArray &aodD0toKpiRef = *fD0toKpiTClArr;
161
162
163   // loop over D0->Kpi candidates
164   Int_t nInD0toKpi = inputArrayD0toKpi->GetEntriesFast();
165   printf("Number of D0->Kpi: %d\n",nInD0toKpi);
166   
167   for (Int_t iD0toKpi = 0; iD0toKpi < nInD0toKpi; iD0toKpi++) {
168     AliAODRecoDecayHF2Prong *dIn = (AliAODRecoDecayHF2Prong*)inputArrayD0toKpi->UncheckedAt(iD0toKpi);
169     Bool_t unsetvtx=kFALSE;
170     if(!dIn->GetOwnPrimaryVtx()) {
171       dIn->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
172       unsetvtx=kTRUE;
173     }
174     
175     //Int_t okD0=0,okD0bar=0; 
176     //if(dIn->SelectD0(fVHF->GetD0toKpiCuts(),okD0,okD0bar)) {
177       // get daughter AOD tracks
178       AliAODTrack *trk0 = (AliAODTrack*)dIn->GetDaughter(0);
179       AliAODTrack *trk1 = (AliAODTrack*)dIn->GetDaughter(1);
180       if(!trk0 || !trk1) {
181         trk0=aodIn->GetTrack(trkIDtoEntry[dIn->GetProngID(0)]);
182         trk1=aodIn->GetTrack(trkIDtoEntry[dIn->GetProngID(1)]);
183       }
184       printf("pt of positive track: %f\n",trk0->Pt());
185       printf("pt of negative track: %f\n",trk1->Pt());
186       // HERE ONE COULD RECALCULATE THE VERTEX USING THE KF PACKAGE
187
188       // clone candidate for output AOD
189       AliAODVertex *v = new(verticesHFRef[iOutVerticesHF++]) 
190         AliAODVertex(*(dIn->GetSecondaryVtx()));
191       AliAODRecoDecayHF2Prong *dOut=new(aodD0toKpiRef[iOutD0toKpi++]) 
192         AliAODRecoDecayHF2Prong(*dIn);
193       dOut->SetSecondaryVtx(v);
194       dOut->SetOwnPrimaryVtx((AliAODVertex*)((dIn->GetOwnPrimaryVtx())->Clone()));
195       v->SetParent(dOut);
196     
197     
198     if(unsetvtx) dIn->UnsetOwnPrimaryVtx();
199   } // end loop on D0->Kpi
200
201   printf("Number of selected D0->Kpi: %d\n",iOutD0toKpi);
202
203
204   return;
205 }
206
207 //________________________________________________________________________
208 void AliAnalysisTaskSESelectHF::Terminate(Option_t */*option*/)
209 {
210   // Terminate analysis
211   //
212   if(fDebug > 1) printf("AnalysisTaskSESelectHF: Terminate() \n");
213 }
214