1 /*************************************************************************
2 * Copyright(c) 1998-2008, 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 ////////////////////////////////////////////////////
17 // AliAnalysisTaskFlowEventforRP:
19 // analysis task for filling the flow event
21 // and put it in an output stream so the calculated
22 // Reaction Plane can be stored in the AODHeader
23 // when the AOD is made from the ESD
24 // for cuts the correction framework is used
25 // which also outputs QA histograms to view
26 // the effects of the cuts
27 ////////////////////////////////////////////////////
29 #include "Riostream.h" //needed as include
32 #include "TFile.h" //needed as include
35 #include "TTimeStamp.h"
37 // ALICE Analysis Framework
38 #include "AliAnalysisTaskSE.h"
39 #include "AliAnalysisManager.h"
42 #include "AliESDEvent.h"
43 #include "AliESDInputHandler.h"
46 #include "AliAODEvent.h"
47 #include "AliAODInputHandler.h"
50 #include "AliAODHandler.h"
51 #include "AliMCEventHandler.h"
52 #include "AliMCEvent.h"
54 // ALICE Correction Framework
55 #include "AliCFManager.h"
57 // Interface to Event generators to get Reaction Plane Angle
58 #include "AliGenCocktailEventHeader.h"
59 #include "AliGenHijingEventHeader.h"
60 #include "AliGenGeVSimEventHeader.h"
61 #include "AliGenEposEventHeader.h"
63 // Interface to make the Flow Event Simple used in the flow analysis methods
64 #include "AliFlowEvent.h"
65 #include "AliFlowVector.h"
66 #include "AliAnalysisTaskFlowEventforRP.h"
69 ClassImp(AliAnalysisTaskFlowEventforRP)
71 //________________________________________________________________________
72 AliAnalysisTaskFlowEventforRP::AliAnalysisTaskFlowEventforRP(const char *name) :
73 AliAnalysisTaskSE(name),
79 fMCReactionPlaneAngle(0.)
83 cout<<"AliAnalysisTaskFlowEventforRP::AliAnalysisTaskFlowEventforRP(const char *name)"<<endl;
85 // Define input and output slots here
86 // Input slot #0 works with a TChain
87 DefineInput(0, TChain::Class());
88 // Define here the flow event output
89 DefineOutput(0, AliFlowEventSimple::Class());
93 //________________________________________________________________________
94 AliAnalysisTaskFlowEventforRP::AliAnalysisTaskFlowEventforRP() :
100 fMCReactionPlaneAngle(0.)
103 cout<<"AliAnalysisTaskFlowEventforRP::AliAnalysisTaskFlowEventforRP()"<<endl;
107 //________________________________________________________________________
108 AliAnalysisTaskFlowEventforRP::~AliAnalysisTaskFlowEventforRP()
117 //________________________________________________________________________
118 void AliAnalysisTaskFlowEventforRP::UserCreateOutputObjects()
120 // Called at every worker node to initialize
121 cout<<"AliAnalysisTaskFlowEventforRP::UserCreateOutputObjects()"<<endl;
123 if (!(fAnalysisType == "ESD")) {
124 cout<<"WRONG ANALYSIS TYPE! only ESD for this method."<<endl;
130 //________________________________________________________________________
131 void AliAnalysisTaskFlowEventforRP::UserExec(Option_t *)
135 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
136 AliFlowEvent* fEvent = NULL;
137 AliMCEvent* mcEvent = MCEvent();
138 Double_t fRP = 0.; // the monte carlo reaction plane angle
140 // Fill the FlowEventSimple for ESD input
141 if (fAnalysisType == "ESD") {
142 if (!(fCFManager1&&fCFManager2))
144 cout << "ERROR: No pointer to correction framework cuts! " << endl;
149 AliError("ERROR: ESD not available");
153 //check the offline trigger (check if the event has the correct trigger)
154 //AliInfo(Form("ESD has %d tracks", fInputEvent->GetNumberOfTracks()));
157 if (!fCFManager1->CheckEventCuts(AliCFManager::kEvtRecCuts,esd))
159 cout << "Event does not pass multiplicity cuts" << endl;
163 // make the flowevent
164 fEvent = new AliFlowEvent(esd,fCFManager1,fCFManager2);
166 if (mcEvent && mcEvent->GenEventHeader())
168 fEvent->SetMCReactionPlaneAngle(mcEvent);
169 fRP = fEvent->GetMCReactionPlaneAngle();
172 //check final event cuts
173 Int_t mult = fEvent->NumberOfTracks();
174 cout << "FlowEvent has "<<mult<<" tracks"<<endl;
175 if (mult<fMinMult || mult>fMaxMult)
177 cout << "FlowEvent cut on multiplicity" << endl;
182 // get the flow vector
183 AliFlowVector vQ = fEvent->GetQ();
184 Double_t dRP[1] = {0.0};
185 // Phi is a Double_t, but SetQTheta() needs as input Double_t*,
186 // an array of doubles.
189 cout<<"The reaction plane from MC is "<<fRP<<endl;
190 cout<<"The calculated reaction plane is "<<dRP[0]<<endl;
194 AliAODHeader* header = AODEvent()->GetHeader();
195 header->SetRunNumber(esd->GetRunNumber());
196 header->SetQTheta(dRP,1);
205 //________________________________________________________________________
206 void AliAnalysisTaskFlowEventforRP::Terminate(Option_t *)
208 // Called once at the end of the query -- do not call in case of CAF