1 /*************************************************************************
2 * Copyright(c) 1998-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 ///////////////////////////////////////////////////////////////////////////
18 // Basic Analysis Task //
19 // for Dielectron Analysis //
21 ///////////////////////////////////////////////////////////////////////////
26 #include <AliCFContainer.h>
27 #include <AliVEvent.h>
28 #include <AliInputEventHandler.h>
29 #include <AliESDInputHandler.h>
30 #include <AliAnalysisManager.h>
31 #include <AliAODInputHandler.h>
32 #include <AliTriggerAnalysis.h>
34 #include "AliDielectron.h"
35 #include "AliDielectronHistos.h"
36 #include "AliDielectronCF.h"
37 #include "AliAnalysisTaskDielectronSE.h"
39 ClassImp(AliAnalysisTaskDielectronSE)
41 //_________________________________________________________________________________
42 AliAnalysisTaskDielectronSE::AliAnalysisTaskDielectronSE() :
45 fSelectPhysics(kFALSE),
46 fTriggerMask(AliVEvent::kMB),
47 fTriggerOnV0AND(kFALSE),
48 fRejectPileup(kFALSE),
49 fTriggerAnalysis(0x0),
58 //_________________________________________________________________________________
59 AliAnalysisTaskDielectronSE::AliAnalysisTaskDielectronSE(const char *name) :
60 AliAnalysisTaskSE(name),
62 fSelectPhysics(kFALSE),
63 fTriggerMask(AliVEvent::kMB),
64 fTriggerOnV0AND(kFALSE),
65 fRejectPileup(kFALSE),
66 fTriggerAnalysis(0x0),
73 DefineInput(0,TChain::Class());
74 DefineOutput(1, THashList::Class());
75 DefineOutput(2, AliCFContainer::Class());
76 DefineOutput(3, TH1D::Class());
79 //_________________________________________________________________________________
80 void AliAnalysisTaskDielectronSE::UserCreateOutputObjects()
83 // Initialise the framework objects
86 AliError("No Dielectron framework object set !!!");
90 if (fDielectron->GetHistogramList()){
91 PostData(1, const_cast<THashList*>(fDielectron->GetHistogramList()));
93 if (fDielectron->GetCFManagerPair()){
94 PostData(2, const_cast<AliCFContainer*>(fDielectron->GetCFManagerPair()->GetContainer()));
98 fEventStat=new TH1D("hEventStat","Event statistics",5,0,5);
99 fEventStat->GetXaxis()->SetBinLabel(1,"Before Phys. Sel.");
100 fEventStat->GetXaxis()->SetBinLabel(2,"After Phys. Sel.");
102 Int_t nbins=kNbinsEvent+2;
104 fEventStat=new TH1D("hEventStat","Event statistics",nbins,0,nbins);
105 fEventStat->GetXaxis()->SetBinLabel(1,"Before Phys. Sel.");
106 fEventStat->GetXaxis()->SetBinLabel(2,"After Phys. Sel.");
109 fEventStat->GetXaxis()->SetBinLabel(3,"Bin3 not used");
110 fEventStat->GetXaxis()->SetBinLabel(4,"Bin4 not used");
111 fEventStat->GetXaxis()->SetBinLabel(5,"Bin5 not used");
113 if(fTriggerOnV0AND) fEventStat->GetXaxis()->SetBinLabel(3,"V0and triggers");
114 if (fEventFilter) fEventStat->GetXaxis()->SetBinLabel(4,"After Event Filter");
115 if (fRejectPileup) fEventStat->GetXaxis()->SetBinLabel(5,"After Pileup rejection");
117 fEventStat->GetXaxis()->SetBinLabel((kNbinsEvent+1),Form("#splitline{1 candidate}{%s}",fDielectron->GetName()));
118 fEventStat->GetXaxis()->SetBinLabel((kNbinsEvent+2),Form("#splitline{With >1 candidate}{%s}",fDielectron->GetName()));
122 if (!fTriggerAnalysis) fTriggerAnalysis=new AliTriggerAnalysis;
123 fTriggerAnalysis->EnableHistograms();
124 fTriggerAnalysis->SetAnalyzeMC(AliDielectronMC::Instance()->HasMC());
126 PostData(3,fEventStat);
130 //_________________________________________________________________________________
131 void AliAnalysisTaskDielectronSE::UserExec(Option_t *)
134 // Main loop. Called for every event
137 if (!fDielectron) return;
139 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
140 Bool_t isESD=man->GetInputEventHandler()->IsA()==AliESDInputHandler::Class();
141 Bool_t isAOD=man->GetInputEventHandler()->IsA()==AliAODInputHandler::Class();
143 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
144 if (!inputHandler) return;
146 if ( inputHandler->GetPIDResponse() ){
147 AliDielectronVarManager::SetPIDResponse( inputHandler->GetPIDResponse() );
149 AliFatal("This task needs the PID response attached to the input event handler!");
152 // Was event selected ?
153 UInt_t isSelected = AliVEvent::kAny;
154 if( fSelectPhysics && inputHandler){
155 if((isESD && inputHandler->GetEventSelection()) || isAOD){
156 isSelected = inputHandler->IsEventSelected();
157 isSelected&=fTriggerMask;
162 //Before physics selection
163 fEventStat->Fill(kAllEvents);
165 PostData(3,fEventStat);
168 //after physics selection
169 fEventStat->Fill(kSelectedEvents);
173 if(isESD){if (!fTriggerAnalysis->IsOfflineTriggerFired(static_cast<AliESDEvent*>(InputEvent()), AliTriggerAnalysis::kV0AND))
175 if(isAOD){if(!((static_cast<AliAODEvent*>(InputEvent()))->GetVZEROData()->GetV0ADecision() == AliVVZERO::kV0BB &&
176 (static_cast<AliAODEvent*>(InputEvent()))->GetVZEROData()->GetV0CDecision() == AliVVZERO::kV0BB) )
181 fEventStat->Fill(kV0andEvents);
183 //Fill Event histograms before the event filter
184 Double_t values[AliDielectronVarManager::kNMaxValues]={0};
185 Double_t valuesMC[AliDielectronVarManager::kNMaxValues]={0};
186 AliDielectronVarManager::Fill(InputEvent(),values);
187 Bool_t hasMC=AliDielectronMC::Instance()->HasMC();
189 if (AliDielectronMC::Instance()->ConnectMCEvent())
190 AliDielectronVarManager::Fill(AliDielectronMC::Instance()->GetMCEvent(),valuesMC);
193 AliDielectronHistos *h=fDielectron->GetHistoManager();
195 if (h->GetHistogramList()->FindObject("Event_noCuts"))
196 h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,values);
197 if (hasMC && h->GetHistogramList()->FindObject("MCEvent_noCuts"))
198 h->FillClass("Event_noCuts",AliDielectronVarManager::kNMaxValues,valuesMC);
203 if (!fEventFilter->IsSelected(InputEvent())) return;
205 fEventStat->Fill(kFilteredEvents);
209 if (InputEvent()->IsPileupFromSPD(3,0.8,3.,2.,5.)) return;
211 fEventStat->Fill(kPileupEvents);
214 Double_t bz = InputEvent()->GetMagneticField();
215 AliKFParticle::SetField( bz );
217 // make an artificial shift in the electron nsigma. Configured in the Config file
218 AliDielectronPID::SetCorrVal((Double_t)InputEvent()->GetRunNumber());
221 // Actual data processing
223 fDielectron->Process(InputEvent());
225 //statistics for number of selected candidates
226 Int_t ncandidates=fDielectron->GetPairArray(1)->GetEntriesFast();
227 if (ncandidates==1) fEventStat->Fill((kNbinsEvent));
228 else if (ncandidates>1) fEventStat->Fill((kNbinsEvent+1));
231 if (fDielectron->GetHistogramList()){
232 PostData(1, const_cast<THashList*>(fDielectron->GetHistogramList()));
234 if (fDielectron->GetCFManagerPair()){
235 PostData(2, const_cast<AliCFContainer*>(fDielectron->GetCFManagerPair()->GetContainer()));
237 PostData(3,fEventStat);