1 /**************************************************************************
2 * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 /* $Id: AliITSCorrMapSDD.cxx 32906 2009-06-12 16:56:53Z prino $ */
18 ///////////////////////////////////////////////////////////////////
20 // Analysis task to produce Ds candidates mass spectra //
21 // Origin: F.Prino, Torino, prino@to.infn.it //
23 ///////////////////////////////////////////////////////////////////
25 #include <TClonesArray.h>
31 #include <TDatabasePDG.h>
33 #include "AliAnalysisManager.h"
34 #include "AliAODHandler.h"
35 #include "AliAODEvent.h"
36 #include "AliAODVertex.h"
37 #include "AliAODTrack.h"
38 #include "AliAODMCHeader.h"
39 #include "AliAODMCParticle.h"
40 #include "AliAODRecoDecayHF3Prong.h"
41 #include "AliAnalysisVertexingHF.h"
42 #include "AliAnalysisTaskSE.h"
43 #include "AliAnalysisTaskSEDs.h"
45 ClassImp(AliAnalysisTaskSEDs)
48 //________________________________________________________________________
49 AliAnalysisTaskSEDs::AliAnalysisTaskSEDs():
58 // Default constructor
61 //________________________________________________________________________
62 AliAnalysisTaskSEDs::AliAnalysisTaskSEDs(const char *name):
63 AliAnalysisTaskSE(name),
71 // Default constructor
72 // Output slot #1 writes into a TList container
73 Double_t ptlim[6]={0.,1.,3.,5.,10.,9999999.};
76 DefineOutput(1,TList::Class()); //My private output
80 //________________________________________________________________________
81 void AliAnalysisTaskSEDs::SetPtBins(Int_t n, Double_t* lim){
82 // define pt bins for analysis
84 printf("Max. number of Pt bins = %d\n",kMaxPtBins);
91 for(Int_t i=5; i<kMaxPtBins+1; i++) fPtLimits[i]=99999999.;
94 for(Int_t i=0; i<fNPtBins+1; i++) fPtLimits[i]=lim[i];
95 for(Int_t i=fNPtBins+1; i<kMaxPtBins+1; i++) fPtLimits[i]=99999999.;
98 printf("Number of Pt bins = %d\n",fNPtBins);
99 for(Int_t i=0; i<fNPtBins+1; i++) printf(" Bin%d = %8.2f-%8.2f\n",i,fPtLimits[i],fPtLimits[i+1]);
102 //________________________________________________________________________
103 AliAnalysisTaskSEDs::~AliAnalysisTaskSEDs()
116 //________________________________________________________________________
117 void AliAnalysisTaskSEDs::Init()
121 if(fDebug > 1) printf("AnalysisTaskSEDs::Init() \n");
123 gROOT->LoadMacro("ConfigVertexingHF.C");
125 fVHF = (AliAnalysisVertexingHF*)gROOT->ProcessLine("ConfigVertexingHF()");
131 //________________________________________________________________________
132 void AliAnalysisTaskSEDs::UserCreateOutputObjects()
134 // Create the output container
136 if(fDebug > 1) printf("AnalysisTaskSEDs::UserCreateOutputObjects() \n");
138 // Several histograms are more conveniently managed in a TList
139 fOutput = new TList();
141 fOutput->SetName("OutputHistos");
143 Double_t massDs=TDatabasePDG::Instance()->GetParticle(431)->Mass();
144 Double_t minMass=massDs-0.5*fMassRange;
145 Double_t maxMass=massDs+0.5*fMassRange;
148 for(Int_t i=0;i<fNPtBins;i++){
149 index=GetHistoIndex(i);
150 hisname.Form("hMassAllPt%d",i);
151 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,minMass,maxMass);
152 fMassHist[index]->Sumw2();
153 hisname.Form("hMassAllPt%dCuts",i);
154 fMassHistCuts[index]=new TH1F(hisname.Data(),hisname.Data(),100,minMass,maxMass);
155 fMassHistCuts[index]->Sumw2();
156 hisname.Form("hCosPAllPt%d",i);
157 fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
158 fCosPHist[index]->Sumw2();
159 hisname.Form("hDLenAllPt%d",i);
160 fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);
161 fDLenHist[index]->Sumw2();
162 hisname.Form("hDalitzAllPt%d",i);
163 fDalitz[index]=new TH2F(hisname.Data(),hisname.Data(),100,0.,2.,100,0.,2.);
164 fDalitz[index]->Sumw2();
166 index=GetSignalHistoIndex(i);
167 hisname.Form("hMassSigPt%d",i);
168 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,minMass,maxMass);
169 fMassHist[index]->Sumw2();
170 hisname.Form("hMassSigPt%dCuts",i);
171 fMassHistCuts[index]=new TH1F(hisname.Data(),hisname.Data(),100,minMass,maxMass);
172 fMassHistCuts[index]->Sumw2();
173 hisname.Form("hCosPSigPt%d",i);
174 fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
175 fCosPHist[index]->Sumw2();
176 hisname.Form("hDLenSigPt%d",i);
177 fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);
178 fDLenHist[index]->Sumw2();
179 hisname.Form("hDalitzSigPt%d",i);
180 fDalitz[index]=new TH2F(hisname.Data(),hisname.Data(),100,0.,2.,100,0.,2.);
181 fDalitz[index]->Sumw2();
183 hisname.Form("hMassBkgPt%d",i);
184 index=GetBackgroundHistoIndex(i);
185 fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,minMass,maxMass);
186 fMassHist[index]->Sumw2();
187 hisname.Form("hMassBkgPt%dCuts",i);
188 fMassHistCuts[index]=new TH1F(hisname.Data(),hisname.Data(),100,minMass,maxMass);
189 fMassHistCuts[index]->Sumw2();
190 hisname.Form("hCosPBkgPt%d",i);
191 fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
192 fCosPHist[index]->Sumw2();
193 hisname.Form("hDLenBkgPt%d",i);
194 fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);
195 fDLenHist[index]->Sumw2();
196 hisname.Form("hDalitzBkgPt%d",i);
197 fDalitz[index]=new TH2F(hisname.Data(),hisname.Data(),100,0.,2.,100,0.,2.);
198 fDalitz[index]->Sumw2();
201 for(Int_t i=0; i<3*fNPtBins; i++){
202 fOutput->Add(fMassHist[i]);
203 fOutput->Add(fMassHistCuts[i]);
204 fOutput->Add(fCosPHist[i]);
205 fOutput->Add(fDLenHist[i]);
206 fOutput->Add(fDalitz[i]);
209 fChanHist[0] = new TH1F("hChanAll", "KKpi and piKK candidates",4,-0.5,3.5);
210 fChanHist[1] = new TH1F("hChanSig", "KKpi and piKK candidates",4,-0.5,3.5);
211 fChanHist[2] = new TH1F("hChanBkg", "KKpi and piKK candidates",4,-0.5,3.5);
212 fChanHistCuts[0] = new TH1F("hChanAllCuts", "KKpi and piKK candidates",4,-0.5,3.5);
213 fChanHistCuts[1] = new TH1F("hChanSigCuts", "KKpi and piKK candidates",4,-0.5,3.5);
214 fChanHistCuts[2] = new TH1F("hChanBkgCuts", "KKpi and piKK candidates",4,-0.5,3.5);
215 for(Int_t i=0;i<3;i++){
216 fChanHist[i]->Sumw2();
217 fChanHist[i]->SetMinimum(0);
218 fChanHistCuts[i]->Sumw2();
219 fChanHistCuts[i]->SetMinimum(0);
220 fOutput->Add(fChanHist[i]);
221 fOutput->Add(fChanHistCuts[i]);
224 fHistNEvents = new TH1F("hNEvents", "Number of processed events",3,-1.5,1.5);
225 fHistNEvents->Sumw2();
226 fHistNEvents->SetMinimum(0);
227 fOutput->Add(fHistNEvents);
233 //________________________________________________________________________
234 void AliAnalysisTaskSEDs::UserExec(Option_t */*option*/)
236 // Ds selection for current event, fill mass histos and selecetion variable histo
237 // separate signal and backgound if fReadMC is activated
239 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
240 fHistNEvents->Fill(0); // count event
241 // Post the data already here
245 TClonesArray *array3Prong = 0;
246 if(!aod && AODEvent() && IsStandardAOD()) {
247 // In case there is an AOD handler writing a standard AOD, use the AOD
248 // event in memory rather than the input (ESD) event.
249 aod = dynamic_cast<AliAODEvent*> (AODEvent());
250 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
251 // have to taken from the AOD event hold by the AliAODExtension
252 AliAODHandler* aodHandler = (AliAODHandler*)
253 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
254 if(aodHandler->GetExtensions()) {
255 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
256 AliAODEvent *aodFromExt = ext->GetAOD();
257 array3Prong=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
260 array3Prong=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
264 printf("AliAnalysisTaskSEDs::UserExec: Charm3Prong branch not found!\n");
269 TClonesArray *arrayMC=0;
270 AliAODMCHeader *mcHeader=0;
272 // AOD primary vertex
273 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
279 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
281 printf("AliAnalysisTaskSEDs::UserExec: MC particles branch not found!\n");
286 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
288 printf("AliAnalysisTaskSEDs::UserExec: MC header branch not found!\n");
293 Int_t n3Prong = array3Prong->GetEntriesFast();
294 if(fDebug>1) printf("Number of Ds->KKpi: %d\n",n3Prong);
297 Int_t pdgDstoKKpi[3]={321,321,211};
298 Double_t cutsDs[14]={0.2,0.4,0.4,0.,0.,0.005,0.038,0.,0.,0.95,0.,0.1,0.004,0.035};
299 for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
300 AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
303 Bool_t unsetvtx=kFALSE;
304 if(!d->GetOwnPrimaryVtx()){
305 d->SetOwnPrimaryVtx(vtx1);
309 Int_t isPhi,isK0star;
310 Int_t isKKpiTC,ispiKKTC;
311 Int_t isPhiTC,isK0starTC;
312 if(d->SelectDs(fVHF->GetDsCuts(),isKKpi,ispiKK,isPhi,isK0star)) {
313 Double_t ptCand = d->Pt();
314 Int_t iPtBin=TMath::BinarySearch(fNPtBins,fPtLimits,ptCand);
315 Bool_t passTightCuts=d->SelectDs(cutsDs,isKKpiTC,ispiKKTC,isPhiTC,isK0starTC);
318 labDs = d->MatchToMC(431,arrayMC,3,pdgDstoKKpi);
321 Double_t dlen=d->DecayLength();
322 Double_t cosp=d->CosPointingAngle();
323 Int_t index=GetHistoIndex(iPtBin);
328 if(isKKpiTC) typeTC+=1;
329 if(ispiKKTC) typeTC+=2;
330 fCosPHist[index]->Fill(cosp);
331 fDLenHist[index]->Fill(dlen);
332 fChanHist[0]->Fill(type);
333 if(passTightCuts) fChanHistCuts[0]->Fill(typeTC);
336 index=GetSignalHistoIndex(iPtBin);
337 fCosPHist[index]->Fill(cosp);
338 fDLenHist[index]->Fill(dlen);
339 fChanHist[1]->Fill(type);
340 if(passTightCuts) fChanHistCuts[1]->Fill(typeTC);
342 index=GetBackgroundHistoIndex(iPtBin);
343 fCosPHist[index]->Fill(cosp);
344 fDLenHist[index]->Fill(dlen);
345 fChanHist[2]->Fill(type);
346 if(passTightCuts) fChanHistCuts[2]->Fill(typeTC);
350 index=GetHistoIndex(iPtBin);
351 Double_t invMass=d->InvMassDsKKpi();
352 fMassHist[index]->Fill(invMass);
353 Double_t mass01=d->InvMass2Prongs(0,1,321,321);
354 Double_t mass12=d->InvMass2Prongs(1,2,321,211);
355 fDalitz[index]->Fill(mass01,mass12);
356 if(passTightCuts && isKKpiTC) fMassHistCuts[index]->Fill(invMass);
359 index=GetSignalHistoIndex(iPtBin);
360 fMassHist[index]->Fill(invMass);
361 fDalitz[index]->Fill(mass01,mass12);
362 if(passTightCuts&& isKKpiTC) fMassHistCuts[index]->Fill(invMass);
364 index=GetBackgroundHistoIndex(iPtBin);
365 fMassHist[index]->Fill(invMass);
366 fDalitz[index]->Fill(mass01,mass12);
367 if(passTightCuts&& isKKpiTC) fMassHistCuts[index]->Fill(invMass);
372 index=GetHistoIndex(iPtBin);
373 Double_t invMass=d->InvMassDspiKK();
374 fMassHist[index]->Fill(invMass);
375 if(passTightCuts && ispiKKTC) fMassHistCuts[index]->Fill(invMass);
378 index=GetSignalHistoIndex(iPtBin);
379 fMassHist[index]->Fill(invMass);
380 if(passTightCuts && ispiKKTC) fMassHistCuts[index]->Fill(invMass);
382 index=GetBackgroundHistoIndex(iPtBin);
383 fMassHist[index]->Fill(invMass);
384 if(passTightCuts && ispiKKTC) fMassHistCuts[index]->Fill(invMass);
389 if(unsetvtx) d->UnsetOwnPrimaryVtx();
397 //_________________________________________________________________
399 void AliAnalysisTaskSEDs::Terminate(Option_t */*option*/)
401 // Terminate analysis
403 if(fDebug > 1) printf("AnalysisTaskSEDs: Terminate() \n");
404 fOutput = dynamic_cast<TList*> (GetOutputData(1));
406 printf("ERROR: fOutput not available\n");
409 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("hNEvents"));
410 fChanHist[0] = dynamic_cast<TH1F*>(fOutput->FindObject("hChanAll"));
411 fChanHist[1] = dynamic_cast<TH1F*>(fOutput->FindObject("hChanSig"));
412 fChanHist[2] = dynamic_cast<TH1F*>(fOutput->FindObject("hChanBkg"));
413 fChanHistCuts[0] = dynamic_cast<TH1F*>(fOutput->FindObject("hChanAllCuts"));
414 fChanHistCuts[1] = dynamic_cast<TH1F*>(fOutput->FindObject("hChanSigCuts"));
415 fChanHistCuts[2] = dynamic_cast<TH1F*>(fOutput->FindObject("hChanBkgCuts"));
420 for(Int_t i=0;i<fNPtBins;i++){
422 index=GetHistoIndex(i);
423 hisname.Form("hMassAllPt%d",i);
424 fMassHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
425 hisname.Form("hMassAllPt%dCuts",i);
426 fMassHistCuts[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
427 hisname.Form("hCosPAllPt%d",i);
428 fCosPHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
429 hisname.Form("hDLenAllPt%d",i);
430 fDLenHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
431 hisname.Form("hDalitzAllPt%d",i);
432 fDalitz[index]=dynamic_cast<TH2F*>(fOutput->FindObject(hisname.Data()));
434 index=GetSignalHistoIndex(i);
435 hisname.Form("hMassSigPt%d",i);
436 fMassHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
437 hisname.Form("hMassSigPt%dCuts",i);
438 fMassHistCuts[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
439 hisname.Form("hCosPSigPt%d",i);
440 fCosPHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
441 hisname.Form("hDLenSigPt%d",i);
442 fDLenHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
443 hisname.Form("hDalitzSigPt%d",i);
444 fDalitz[index]=dynamic_cast<TH2F*>(fOutput->FindObject(hisname.Data()));
446 index=GetBackgroundHistoIndex(i);
447 hisname.Form("hMassBkgPt%d",i);
448 fMassHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
449 hisname.Form("hMassBkgPt%dCuts",i);
450 fMassHistCuts[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
451 hisname.Form("hCosPBkgPt%d",i);
452 fCosPHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
453 hisname.Form("hDLenBkgPt%d",i);
454 fDLenHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
455 hisname.Form("hDalitzBkgPt%d",i);
456 fDalitz[index]=dynamic_cast<TH2F*>(fOutput->FindObject(hisname.Data()));