1 //------------------------------------------------------
\r
2 // AliAnalysisTaskFemto - A task for the analysis framework
\r
3 // from the FEMTOSCOPY analysis of PWG2. Creates the necessary
\r
4 // connection between the ESD or AOD input and the femtoscopic
\r
6 // Author: Adam Kisiel, OSU; Adam.Kisiel@cern.ch
\r
7 //------------------------------------------------------
\r
11 #include "TCanvas.h"
\r
12 #include "TSystem.h"
\r
14 #include "TInterpreter.h"
\r
16 #include "AliAnalysisTask.h"
\r
18 #include "AliESDEvent.h"
\r
20 #include "AliFemtoAnalysis.h"
\r
21 #include "AliAnalysisTaskFemto.h"
\r
22 #include "AliVHeader.h"
\r
23 #include "AliGenEventHeader.h"
\r
24 #include "AliGenHijingEventHeader.h"
\r
25 #include "AliGenCocktailEventHeader.h"
\r
27 ClassImp(AliAnalysisTaskFemto)
\r
29 // Default name for the setup macro of femto analysis
\r
30 // This function MUST be defined in the separate file !!!
\r
31 // extern AliFemtoManager *ConfigFemtoAnalysis();
\r
33 //________________________________________________________________________
\r
34 AliAnalysisTaskFemto::AliAnalysisTaskFemto(const char *name, const char *aConfigMacro="ConfigFemtoAnalysis.C"):
\r
35 AliAnalysisTask(name,""),
\r
46 // Input slot #0 works with an Ntuple
\r
47 DefineInput(0, TChain::Class());
\r
48 // Output slot #0 writes into a TH1 container
\r
49 DefineOutput(0, TList::Class());
\r
50 fConfigMacro = (char *) malloc(sizeof(char) * strlen(aConfigMacro));
\r
51 strcpy(fConfigMacro, aConfigMacro);
\r
54 AliAnalysisTaskFemto::AliAnalysisTaskFemto(const AliAnalysisTaskFemto& aFemtoTask):
\r
55 AliAnalysisTask(aFemtoTask),
\r
66 fESD = aFemtoTask.fESD;
\r
67 fAOD = aFemtoTask.fAOD;
\r
68 fStack = aFemtoTask.fStack;
\r
69 fOutputList = aFemtoTask.fOutputList;
\r
70 fReader = aFemtoTask.fReader;
\r
71 fManager = aFemtoTask.fManager;
\r
72 fAnalysisType = aFemtoTask.fAnalysisType;
\r
73 fConfigMacro = (char *) malloc(sizeof(char) * strlen(aFemtoTask.fConfigMacro));
\r
74 strcpy(fConfigMacro, aFemtoTask.fConfigMacro);
\r
78 AliAnalysisTaskFemto& AliAnalysisTaskFemto::operator=(const AliAnalysisTaskFemto& aFemtoTask){
\r
79 // assignment operator
\r
80 if (this == &aFemtoTask)
\r
83 fESD = aFemtoTask.fESD;
\r
84 fAOD = aFemtoTask.fAOD;
\r
85 fStack = aFemtoTask.fStack;
\r
86 fOutputList = aFemtoTask.fOutputList;
\r
87 fReader = aFemtoTask.fReader;
\r
88 fManager = aFemtoTask.fManager;
\r
89 fAnalysisType = aFemtoTask.fAnalysisType;
\r
90 if (fConfigMacro) free(fConfigMacro);
\r
91 fConfigMacro = (char *) malloc(sizeof(char) * strlen(aFemtoTask.fConfigMacro));
\r
92 strcpy(fConfigMacro, aFemtoTask.fConfigMacro);
\r
97 AliAnalysisTaskFemto::~AliAnalysisTaskFemto()
\r
99 if (fConfigMacro) free(fConfigMacro);
\r
103 //________________________________________________________________________
\r
104 void AliAnalysisTaskFemto::ConnectInputData(Option_t *) {
\r
105 printf(" ConnectInputData %s\n", GetName());
\r
111 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
\r
113 Printf("ERROR: Could not read chain from input slot 0");
\r
116 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
\r
119 cout << "Selected ESD analysis" << endl;
\r
123 Printf("ERROR: Could not get ESDInputHandler");
\r
126 fESD = esdH->GetEvent();
\r
130 AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
\r
133 Printf("ERROR: Could not get AODInputHandler");
\r
136 cout << "Selected AOD analysis" << endl;
\r
139 fAOD = aodH->GetEvent();
\r
142 if ((!fAOD) && (!fESD)) {
\r
143 Printf("Wrong analysis type: Only ESD and AOD types are allowed!");
\r
150 //________________________________________________________________________
\r
151 void AliAnalysisTaskFemto::CreateOutputObjects() {
\r
152 printf("Creating Femto Analysis objects\n");
\r
154 gSystem->SetIncludePath("-I$ROOTSYS/include -I./STEERBase/ -I./ESD/ -I./AOD/ -I./ANALYSIS/ -I./ANALYSISalice/ -I./PWG2AOD/AOD -I./PWG2femtoscopy/FEMTOSCOPY/AliFemto -I./PWG2femtoscopyUser/FEMTOSCOPY/AliFemtoUser");
\r
155 gROOT->LoadMacro(fConfigMacro);
\r
156 // fJetFinder = (AliJetFinder*) gInterpreter->ProcessLine("ConfigJetAnalysis()");
\r
157 SetFemtoManager((AliFemtoManager *) gInterpreter->ProcessLine("ConfigFemtoAnalysis()"));
\r
160 fOutputList = fManager->Analysis(0)->GetOutputList();
\r
162 for (unsigned int ian = 1; ian<fManager->AnalysisCollection()->size(); ian++) {
\r
163 tOL = fManager->Analysis(ian)->GetOutputList();
\r
165 TIter nextListCf(tOL);
\r
166 while (TObject *obj = nextListCf()) {
\r
167 fOutputList->Add(obj);
\r
174 //________________________________________________________________________
\r
175 void AliAnalysisTaskFemto::Exec(Option_t *) {
\r
176 // Task making a femtoscopic analysis.
\r
178 if (fAnalysisType==1) {
\r
180 Printf("ERROR: fESD not available");
\r
185 AliMCEventHandler* mctruth = (AliMCEventHandler*)
\r
186 ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
\r
188 AliGenHijingEventHeader *hdh = 0;
\r
190 fStack = mctruth->MCEvent()->Stack();
\r
192 AliGenCocktailEventHeader *hd = dynamic_cast<AliGenCocktailEventHeader *> (mctruth->MCEvent()->GenEventHeader());
\r
196 // printf ("Got MC cocktail event header %p\n", (void *) hd);
\r
197 TList *lhd = hd->GetHeaders();
\r
198 // printf ("Got list of headers %d\n", lhd->GetEntries());
\r
200 for (int iterh=0; iterh<lhd->GetEntries(); iterh++)
\r
202 hdh = dynamic_cast<AliGenHijingEventHeader *> (lhd->At(iterh));
\r
203 // printf ("HIJING header at %i is %p\n", iterh, (void *) hdh);
\r
209 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
\r
212 Printf("ERROR: Could not get ESDInputHandler");
\r
216 fESD = esdH->GetEvent();
\r
219 printf("Tracks in ESD: %d \n",fESD->GetNumberOfTracks());
\r
221 if (fESD->GetNumberOfTracks() >= 0) {
\r
224 printf("ERROR: No ESD reader for ESD analysis !\n");
\r
227 AliFemtoEventReaderESDChain* fesdc = dynamic_cast<AliFemtoEventReaderESDChain *> (fReader);
\r
230 // Process the event with no Kine information
\r
231 fesdc->SetESDSource(fESD);
\r
232 fManager->ProcessEvent();
\r
234 AliFemtoEventReaderESDChainKine* fesdck = dynamic_cast<AliFemtoEventReaderESDChainKine *> (fReader);
\r
237 // Process the event with Kine information
\r
238 fesdck->SetESDSource(fESD);
\r
239 fesdck->SetStackSource(fStack);
\r
241 fesdck->SetGenEventHeader(hdh);
\r
242 fManager->ProcessEvent();
\r
246 // Post the output histogram list
\r
247 PostData(0, fOutputList);
\r
250 if (fAnalysisType==2) {
\r
252 Printf("ERROR: fAOD not available");
\r
257 AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
\r
260 Printf("ERROR: Could not get AODInputHandler");
\r
265 fAOD = aodH->GetEvent();
\r
268 printf("Tracks in AOD: %d \n",fAOD->GetNumberOfTracks());
\r
270 if (fAOD->GetNumberOfTracks() > 0) {
\r
272 printf("ERROR: No AOD reader for AOD analysis! \n");
\r
275 AliFemtoEventReaderAODChain* faodc = dynamic_cast<AliFemtoEventReaderAODChain *> (fReader);
\r
278 // Process the event
\r
279 faodc->SetAODSource(fAOD);
\r
280 fManager->ProcessEvent();
\r
285 // Post the output histogram list
\r
286 PostData(0, fOutputList);
\r
290 //________________________________________________________________________
\r
291 void AliAnalysisTaskFemto::Terminate(Option_t *) {
\r
292 // Do the final processing
\r
294 fManager->Finish();
\r
297 //________________________________________________________________________
\r
298 void AliAnalysisTaskFemto:: FinishTaskOutput() {
\r
299 // Do the final processing
\r
301 fManager->Finish();
\r
304 //________________________________________________________________________
\r
305 void AliAnalysisTaskFemto::SetFemtoReaderESD(AliFemtoEventReaderESDChain *aReader)
\r
307 printf("Selectring Femto reader for ESD\n");
\r
310 //________________________________________________________________________
\r
311 void AliAnalysisTaskFemto::SetFemtoReaderESDKine(AliFemtoEventReaderESDChainKine *aReader)
\r
313 printf("Selectring Femto reader for ESD with Kinematics information\n");
\r
316 //________________________________________________________________________
\r
317 void AliAnalysisTaskFemto::SetFemtoReaderAOD(AliFemtoEventReaderAODChain *aReader)
\r
319 printf("Selecting Femto reader for AOD\n");
\r
322 //________________________________________________________________________
\r
323 void AliAnalysisTaskFemto::SetFemtoManager(AliFemtoManager *aManager)
\r
325 fManager = aManager;
\r
326 printf("Got reader %p\n", (void *) aManager->EventReader());
\r
327 AliFemtoEventReaderESDChain *tReaderESDChain = dynamic_cast<AliFemtoEventReaderESDChain *> (aManager->EventReader());
\r
328 AliFemtoEventReaderESDChainKine *tReaderESDChainKine = dynamic_cast<AliFemtoEventReaderESDChainKine *> (aManager->EventReader());
\r
329 AliFemtoEventReaderAODChain *tReaderAODChain = dynamic_cast<AliFemtoEventReaderAODChain *> (aManager->EventReader());
\r
331 if ((!tReaderESDChain) && (!tReaderESDChainKine) && (!tReaderAODChain)) {
\r
332 printf("No AliFemto event reader created. Will not run femto analysis.\n");
\r
335 if (tReaderESDChain) SetFemtoReaderESD(tReaderESDChain);
\r
336 if (tReaderESDChainKine) SetFemtoReaderESDKine(tReaderESDChainKine);
\r
337 if (tReaderAODChain) SetFemtoReaderAOD(tReaderAODChain);
\r