2 #include "AliAnalysisTaskFirstPhysics.h"
9 #include "AliAnalysisTaskSE.h"
10 #include "AliAnalysisManager.h"
11 #include "AliESDtrackCuts.h"
12 #include "AliESDEvent.h"
13 #include "AliESDHeader.h"
14 #include "AliMCEvent.h"
15 #include "AliMultiplicity.h"
17 #include "AliGenEventHeader.h"
18 #include "AliGenPythiaEventHeader.h"
19 #include "AliGenDPMjetEventHeader.h"
22 ClassImp(AliAnalysisTaskFirstPhysics)
24 //________________________________________________________________________
25 AliAnalysisTaskFirstPhysics::AliAnalysisTaskFirstPhysics(const char *name) :
26 AliAnalysisTaskSE(name),
31 fMCProcessType(kProcND),
38 DefineOutput(1, TList::Class());
39 for (Int_t i = 0; i < knTrackCuts; i ++) {
44 //________________________________________________________________________
45 AliAnalysisTaskFirstPhysics::~AliAnalysisTaskFirstPhysics()
47 // Destructor. Clean-up the output list, but not the histograms that are put inside
48 // (the list is owner and will clean-up these histograms). Protect in PROOF case.
49 if (fOutput && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
52 for (Int_t i = 0; i < knTrackCuts; i ++) {
61 //________________________________________________________________________
62 void AliAnalysisTaskFirstPhysics::PrepareOutputList()
65 AliError("fOutput already initialised.");
68 fOutput = new TList();
70 TH1::SetDefaultSumw2(kTRUE);
72 AliError("fTrigger is already initialised.");
75 fTrigger = new AliTriggerAnalysis;
78 //________________________________________________________________________
79 void AliAnalysisTaskFirstPhysics::PrepareDefaultTrackCuts()
81 // quality cut on ITS+TPC tracks
82 fTrackCuts[kTrackCutQGlo] = new AliESDtrackCuts();
84 fTrackCuts[kTrackCutQGlo]->SetMinNClustersTPC(70);
85 fTrackCuts[kTrackCutQGlo]->SetMaxChi2PerClusterTPC(4);
86 fTrackCuts[kTrackCutQGlo]->SetAcceptKinkDaughters(kFALSE);
87 fTrackCuts[kTrackCutQGlo]->SetRequireTPCRefit(kTRUE);
89 fTrackCuts[kTrackCutQGlo]->SetRequireITSRefit(kTRUE);
90 fTrackCuts[kTrackCutQGlo]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
91 fTrackCuts[kTrackCutQGlo]->SetEtaRange(-fCutEta, fCutEta);
92 fTrackCuts[kTrackCutQGlo]->SetPtRange(fCutTrackPtMin, fCutTrackPtMax);
93 // quality cut on ITS_SA tracks (complementary to ITS+TPC)
94 fTrackCuts[kTrackCutQITS] = new AliESDtrackCuts();
95 fTrackCuts[kTrackCutQITS]->SetRequireITSRefit(kTRUE);
96 fTrackCuts[kTrackCutQITS]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
97 fTrackCuts[kTrackCutQITS]->SetEtaRange(-fCutEta, fCutEta);
98 // primary selection for tracks with SPD hits
99 fTrackCuts[kTrackCutDCAwSPD] = new AliESDtrackCuts();
100 fTrackCuts[kTrackCutDCAwSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
101 fTrackCuts[kTrackCutDCAwSPD]->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
102 fTrackCuts[kTrackCutDCAwSPD]->SetMaxDCAToVertexZ(0.5);
103 fTrackCuts[kTrackCutDCAwSPD]->SetEtaRange(-fCutEta, fCutEta);
104 // primary selection for tracks w/o SPD hits
105 fTrackCuts[kTrackCutDCAwoSPD] = new AliESDtrackCuts();
106 fTrackCuts[kTrackCutDCAwoSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
107 fTrackCuts[kTrackCutDCAwoSPD]->SetMaxDCAToVertexXYPtDep("1.5*(0.0182+0.0350/pt^1.01)");
108 fTrackCuts[kTrackCutDCAwoSPD]->SetMaxDCAToVertexZ(0.5);
109 fTrackCuts[kTrackCutDCAwoSPD]->SetEtaRange(-fCutEta, fCutEta);
111 // tracks without SPD hits
112 fTrackCuts[kTrackCutNoSPD] = new AliESDtrackCuts();
113 fTrackCuts[kTrackCutNoSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
114 // tracks from TPC SA
115 fTrackCuts[kTrackCutTPConly] = new AliESDtrackCuts();
116 fTrackCuts[kTrackCutTPConly]->SetRequireTPCStandAlone(kTRUE);
119 //________________________________________________________________________
120 void AliAnalysisTaskFirstPhysics::UserCreateOutputObjects()
124 PrepareDefaultTrackCuts();
126 // create more histograms here using UserHisto1d and UserHisto2d
128 PostData(1, fOutput); // Post data for ALL output slots >0 here, to get at least an empty histogram
131 //________________________________________________________________________
132 bool AliAnalysisTaskFirstPhysics::GetESDEvent()
135 // Get a pointer to the reconstructed event
136 AliVEvent *event = InputEvent();
138 AliError("ERROR: Could not retrieve event.");
141 // try to access the ESD information
142 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event);
144 AliError("InputEvent() is not AliESDEvent.");
151 //________________________________________________________________________
152 bool AliAnalysisTaskFirstPhysics::CheckVertex()
154 // check for good reconstructed vertex
155 if (!(fESD->GetPrimaryVertex()->GetStatus()) ||
156 !(fESD->GetPrimaryVertexSPD()->GetStatus())) {
159 // if vertex is from spd vertexZ, require more stringent cut
160 if (fESD->GetPrimaryVertex()->IsFromVertexerZ() &&
161 (fESD->GetPrimaryVertex()->GetDispersion() > 0.02 ||
162 fESD->GetPrimaryVertex()->GetZRes() > 0.25 )) {
165 if (TMath::Abs(fESD->GetPrimaryVertex()->GetZ()) > fCutVertexZ) {
171 //________________________________________________________________________
172 bool AliAnalysisTaskFirstPhysics::CheckVertexMC() {
176 if (TMath::Abs(fMCEvent->GetPrimaryVertex()->GetZ()) > fCutVertexZ) {
182 //________________________________________________________________________
183 bool AliAnalysisTaskFirstPhysics::PrepareMCInfo()
186 fMCEvent = MCEvent();
191 AliDebug(4, TString::Format("MC particles: %d", fMCEvent->GetNumberOfTracks()));
192 AliDebug(4, TString::Format("number of particles in the stack: %d", fMCEvent->Stack()->GetNtrack()));
193 AliGenPythiaEventHeader* pythiaGenHeader = 0;
194 AliGenDPMjetEventHeader* dpmHeader = 0;
195 pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(fMCEvent->GenEventHeader());
196 dpmHeader = dynamic_cast<AliGenDPMjetEventHeader*>(fMCEvent->GenEventHeader());
197 // MC event classification
198 Int_t iProcessType = 0;
199 Int_t iSD1flag = 0, iSD2flag = 0, iDDflag = 0,
200 iCDflag = 0, iELflag = 0, iNDflag = 0;
201 if (pythiaGenHeader) {
202 iProcessType = pythiaGenHeader->ProcessType();
209 AliDebug(5, TString::Format("Pythia event, %d type", iProcessType));
210 } else if (dpmHeader) {
211 iProcessType = dpmHeader->ProcessType();
218 AliDebug(5, TString::Format("Phojet event, %d type", iProcessType));
220 AliError("neither pythia nor phojet event");
222 if (iProcessType == iSD1flag) {
223 fMCProcessType = kProcSD1;
224 } else if (iProcessType == iSD2flag) {
225 fMCProcessType = kProcSD2;
226 } else if (iProcessType == iDDflag) {
227 fMCProcessType = kProcDD;
228 } else if (iProcessType == iELflag) {
229 fMCProcessType = kProcEL;
230 } else if (iProcessType == iCDflag) {
231 fMCProcessType = kProcCD;
232 } else if (iProcessType == iNDflag) {
233 fMCProcessType = kProcND;
235 fMCProcessType = kProcIndef;
241 //________________________________________________________________________
242 void AliAnalysisTaskFirstPhysics::UserExec(Option_t *)
244 if (!GetESDEvent()) {
245 AliError("Unable to read the ESD");
248 if (!CheckVertex()) {
252 // custom code comes here
254 PostData(1, fOutput);
257 //________________________________________________________________________
258 TH1D* AliAnalysisTaskFirstPhysics::UserHisto1d(const char *name, const char *title, const char *xlabel, Int_t nbinsx, Double_t xlow, Double_t xup)
260 TH1D *hist = new TH1D(name, title, nbinsx, xlow, xup);
261 hist->GetXaxis()->SetTitle(xlabel);
266 //________________________________________________________________________
267 TH2D* AliAnalysisTaskFirstPhysics::UserHisto2d(const char *name, const char *title, const char *xlabel, Int_t nbinsx, Double_t xlow, Double_t xup, const char *ylabel, Int_t nbinsy, Double_t ylow, Double_t yup)
269 TH2D *hist = new TH2D(name, title, nbinsx, xlow, xup, nbinsy, ylow, yup);
270 hist->GetXaxis()->SetTitle(xlabel);
271 hist->GetYaxis()->SetTitle(ylabel);
276 //________________________________________________________________________
277 bool AliAnalysisTaskFirstPhysics::GetHisto1FromOutput(const char *name, TH1D *&h) const
279 h = dynamic_cast<TH1D*> (fOutput->FindObject(name));
281 AliError(TString::Format("Unable to load histogram from output: %s", name));
288 //________________________________________________________________________
289 bool AliAnalysisTaskFirstPhysics::GetHisto2FromOutput(const char *name, TH2D *&h) const
291 h = dynamic_cast<TH2D*> (fOutput->FindObject(name));
293 AliError(TString::Format("Unable to load histogram from output: %s", name));
300 //________________________________________________________________________
301 void AliAnalysisTaskFirstPhysics::Terminate(Option_t *)
303 fOutput = dynamic_cast<TList*> (GetOutputData(1));
305 AliError("Could not retrieve TList fOutput.");