1 //------------------------------------------------------
2 // AliAnalysisTaskFemto - A task for the analysis framework
3 // from the FEMTOSCOPY analysis of PWG2. Creates the necessary
4 // connection between the ESD or AOD input and the femtoscopic
6 // Author: Adam Kisiel, OSU; Adam.Kisiel@cern.ch
7 //------------------------------------------------------
14 #include "TInterpreter.h"
16 //#include "AliAnalysisTask.h"
17 #include "AliAnalysisTaskSE.h"
19 #include "AliESDEvent.h"
21 #include "AliFemtoAnalysis.h"
22 #include "AliAnalysisTaskFemto.h"
23 #include "AliVHeader.h"
24 #include "AliGenEventHeader.h"
25 #include "AliGenHijingEventHeader.h"
26 #include "AliGenCocktailEventHeader.h"
28 ClassImp(AliAnalysisTaskFemto)
30 // Default name for the setup macro of femto analysis
31 // This function MUST be defined in the separate file !!!
32 // extern AliFemtoManager *ConfigFemtoAnalysis();
34 //________________________________________________________________________
35 AliAnalysisTaskFemto::AliAnalysisTaskFemto(const char *name, const char *aConfigMacro, const char *aConfigParams):
36 AliAnalysisTaskSE(name), //AliAnalysisTask(name,""),
50 // Input slot #0 works with an Ntuple
51 DefineInput(0, TChain::Class());
52 // Output slot #0 writes into a TH1 container
53 DefineOutput(0, TList::Class());
54 fConfigMacro = (char *) malloc(sizeof(char) * strlen(aConfigMacro));
55 strcpy(fConfigMacro, aConfigMacro);
56 fConfigParams = (char *) malloc(sizeof(char) * strlen(aConfigParams));
57 strcpy(fConfigParams, aConfigParams);
59 //________________________________________________________________________
60 AliAnalysisTaskFemto::AliAnalysisTaskFemto(const char *name, const char *aConfigMacro="ConfigFemtoAnalysis.C"):
61 AliAnalysisTaskSE(name), //AliAnalysisTask(name,""),
75 // Input slot #0 works with an Ntuple
76 DefineInput(0, TChain::Class());
77 // Output slot #0 writes into a TH1 container
78 DefineOutput(0, TList::Class());
79 fConfigMacro = (char *) malloc(sizeof(char) * strlen(aConfigMacro));
80 strcpy(fConfigMacro, aConfigMacro);
81 fConfigParams = (char *) malloc(sizeof(char) * 2);
82 strcpy(fConfigParams, "");
85 AliAnalysisTaskFemto::AliAnalysisTaskFemto(const AliAnalysisTaskFemto& aFemtoTask):
86 AliAnalysisTaskSE(aFemtoTask), //AliAnalysisTask(aFemtoTask),
100 fESD = aFemtoTask.fESD;
101 fESDpid = aFemtoTask.fESDpid;
102 fAOD = aFemtoTask.fAOD;
103 fAODpidUtil = aFemtoTask.fAODpidUtil;
104 fStack = aFemtoTask.fStack;
105 fOutputList = aFemtoTask.fOutputList;
106 fReader = aFemtoTask.fReader;
107 fManager = aFemtoTask.fManager;
108 fAnalysisType = aFemtoTask.fAnalysisType;
109 fConfigMacro = (char *) malloc(sizeof(char) * strlen(aFemtoTask.fConfigMacro));
110 strcpy(fConfigMacro, aFemtoTask.fConfigMacro);
111 fConfigParams = (char *) malloc(sizeof(char) * strlen(aFemtoTask.fConfigParams));
112 strcpy(fConfigParams, aFemtoTask.fConfigParams);
116 AliAnalysisTaskFemto& AliAnalysisTaskFemto::operator=(const AliAnalysisTaskFemto& aFemtoTask){
117 // assignment operator
118 if (this == &aFemtoTask)
121 fESD = aFemtoTask.fESD;
122 fESDpid = aFemtoTask.fESDpid;
123 fAOD = aFemtoTask.fAOD;
124 fAODpidUtil = aFemtoTask.fAODpidUtil;
125 fStack = aFemtoTask.fStack;
126 fOutputList = aFemtoTask.fOutputList;
127 fReader = aFemtoTask.fReader;
128 fManager = aFemtoTask.fManager;
129 fAnalysisType = aFemtoTask.fAnalysisType;
130 if (fConfigMacro) free(fConfigMacro);
131 fConfigMacro = (char *) malloc(sizeof(char) * strlen(aFemtoTask.fConfigMacro));
132 strcpy(fConfigMacro, aFemtoTask.fConfigMacro);
133 if (fConfigParams) free(fConfigParams);
134 fConfigParams = (char *) malloc(sizeof(char) * strlen(aFemtoTask.fConfigParams));
135 strcpy(fConfigParams, aFemtoTask.fConfigParams);
140 AliAnalysisTaskFemto::~AliAnalysisTaskFemto()
142 if (fConfigMacro) free(fConfigMacro);
143 if (fConfigParams) free(fConfigParams);
147 //________________________________________________________________________
148 void AliAnalysisTaskFemto::ConnectInputData(Option_t *) {
149 AliInfo(Form(" ConnectInputData %s\n", GetName()));
157 TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
159 AliWarning("Could not read chain from input slot 0");
163 AliFemtoEventReaderESDChain *femtoReader = dynamic_cast<AliFemtoEventReaderESDChain *> (fReader);
164 if ((dynamic_cast<AliFemtoEventReaderESDChain *> (fReader))) {
165 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
168 AliInfo("Selected ESD analysis");
172 // AliWarning("Could not get ESDInputHandler");
175 fESD = esdH->GetEvent();
176 fESDpid = esdH->GetESDpid();
177 femtoReader->SetESDPid(fESDpid);
181 else if ((dynamic_cast<AliFemtoEventReaderKinematicsChain *> (fReader))) {
182 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
185 AliInfo("Selected ESD analysis");
189 // AliWarning("Could not get ESDInputHandler");
192 fESD = esdH->GetEvent();
193 //fESDpid = esdH->GetESDpid();
194 //femtoReader->SetESDPid(fESDpid);
200 AliFemtoEventReaderESDChainKine *femtoReaderESDKine = dynamic_cast<AliFemtoEventReaderESDChainKine *> (fReader);
201 if ((dynamic_cast<AliFemtoEventReaderESDChainKine *> (fReader))) {
202 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
205 AliInfo("Selected ESD analysis");
209 // AliWarning("Could not get ESDInputHandler");
212 fESD = esdH->GetEvent();
213 fESDpid = esdH->GetESDpid();
214 femtoReaderESDKine->SetESDPid(fESDpid);
219 // AliFemtoEventReaderKinematicsChain *femtoReaderKine = dynamic_cast<AliFemtoEventReaderKinematicsChain *> (fReader);
220 if ((dynamic_cast<AliFemtoEventReaderKinematicsChain *> (fReader))) {
221 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
224 AliInfo("Selected ESD analysis");
228 // AliWarning("Could not get ESDInputHandler");
231 fESD = esdH->GetEvent();
232 //fESDpid = esdH->GetESDpid();
233 //femtoReader->SetESDPid(fESDpid);
239 AliFemtoEventReaderAODChain *femtoReaderAOD = dynamic_cast<AliFemtoEventReaderAODChain *> (fReader);
240 if (dynamic_cast<AliFemtoEventReaderAODChain *> (fReader)) {
241 AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
244 TObject *handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler();
245 AliInfo("Has output handler ");
246 if( handler && handler->InheritsFrom("AliAODHandler") ) {
247 AliInfo("Selected AOD analysis");
249 fAOD = ((AliAODHandler*)handler)->GetAOD();
253 AliWarning("Selected AOD reader but no AOD handler found");
257 AliInfo("Selected AOD analysis");
260 fAOD = aodH->GetEvent();
262 fAODpidUtil = aodH->GetAODpidUtil();
263 // printf("aodH->GetAODpidUtil(): %x",aodH->GetAODpidUtil());
264 femtoReaderAOD->SetAODpidUtil(fAODpidUtil);
268 if ((!fAOD) && (!fESD)) {
269 AliWarning("Wrong analysis type: Only ESD and AOD types are allowed!");
273 //________________________________________________________________________
274 void AliAnalysisTaskFemto::CreateOutputObjects() {
275 AliInfo("Creating Femto Analysis objects\n");
277 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");
279 // sprintf(fcm, "%s++", fConfigMacro);
280 // gROOT->LoadMacro(fcm);
281 gROOT->LoadMacro(fConfigMacro);
282 // fJetFinder = (AliJetFinder*) gInterpreter->ProcessLine("ConfigJetAnalysis()");
284 SetFemtoManager((AliFemtoManager *) gInterpreter->ProcessLine("ConfigFemtoAnalysis()"));
286 SetFemtoManager((AliFemtoManager *) gInterpreter->ProcessLine(Form("ConfigFemtoAnalysis(%s)", fConfigParams)));
289 fOutputList = fManager->Analysis(0)->GetOutputList();
291 for (unsigned int ian = 1; ian<fManager->AnalysisCollection()->size(); ian++) {
292 tOL = fManager->Analysis(ian)->GetOutputList();
294 TIter nextListCf(tOL);
295 while (TObject *obj = nextListCf()) {
296 fOutputList->Add(obj);
302 PostData(0, fOutputList);
305 //________________________________________________________________________
306 void AliAnalysisTaskFemto::Exec(Option_t *) {
307 // Task making a femtoscopic analysis.
309 if (fAnalysisType==1) {
311 AliWarning("fESD not available");
316 AliMCEventHandler* mctruth = (AliMCEventHandler*)
317 ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
319 AliGenHijingEventHeader *hdh = 0;
321 fStack = mctruth->MCEvent()->Stack();
323 AliGenCocktailEventHeader *hd = dynamic_cast<AliGenCocktailEventHeader *> (mctruth->MCEvent()->GenEventHeader());
327 // AliInfo ("Got MC cocktail event header %p\n", (void *) hd);
328 TList *lhd = hd->GetHeaders();
329 // AliInfo ("Got list of headers %d\n", lhd->GetEntries());
331 for (int iterh=0; iterh<lhd->GetEntries(); iterh++)
333 hdh = dynamic_cast<AliGenHijingEventHeader *> (lhd->At(iterh));
334 // AliInfo ("HIJING header at %i is %p\n", iterh, (void *) hdh);
340 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
343 AliWarning("Could not get ESDInputHandler");
347 fESD = esdH->GetEvent();
348 fESDpid = esdH->GetESDpid();
351 AliInfo(Form("Tracks in ESD: %d \n",fESD->GetNumberOfTracks()));
353 if (fESD->GetNumberOfTracks() >= 0) {
356 AliWarning("No ESD reader for ESD analysis !\n");
359 AliFemtoEventReaderESDChain* fesdc = dynamic_cast<AliFemtoEventReaderESDChain *> (fReader);
362 // Process the event with no Kine information
363 fesdc->SetESDSource(fESD);
364 fManager->ProcessEvent();
367 AliFemtoEventReaderKinematicsChain* fkinec = dynamic_cast<AliFemtoEventReaderKinematicsChain *> (fReader);
370 // Process the event with Kine information only
371 fkinec->SetStackSource(fStack);
372 fManager->ProcessEvent();
376 AliFemtoEventReaderESDChainKine* fesdck = dynamic_cast<AliFemtoEventReaderESDChainKine *> (fReader);
379 // Process the event with Kine information
380 fesdck->SetESDSource(fESD);
381 fesdck->SetStackSource(fStack);
383 fesdck->SetGenEventHeader(hdh);
384 fManager->ProcessEvent();
386 AliFemtoEventReaderStandard* fstd = dynamic_cast<AliFemtoEventReaderStandard *> (fReader);
389 // Process the event with Kine information
390 fstd->SetESDSource(fESD);
392 fstd->SetStackSource(fStack);
393 fstd->SetGenEventHeader(hdh);
394 fstd->SetInputType(AliFemtoEventReaderStandard::kESDKine);
397 fstd->SetInputType(AliFemtoEventReaderStandard::kESD);
398 fManager->ProcessEvent();
402 // Post the output histogram list
403 PostData(0, fOutputList);
406 if (fAnalysisType==2) {
408 AliWarning("fAOD not available");
413 // AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
416 // AliWarning("Could not get AODInputHandler");
421 // fAOD = aodH->GetEvent();
424 AliInfo(Form("Tracks in AOD: %d \n",fAOD->GetNumberOfTracks()));
426 if (fAOD->GetNumberOfTracks() > 0) {
428 AliWarning("No AOD reader for AOD analysis! \n");
431 AliFemtoEventReaderAODChain* faodc = dynamic_cast<AliFemtoEventReaderAODChain *> (fReader);
435 faodc->SetAODSource(fAOD);
436 fManager->ProcessEvent();
438 AliFemtoEventReaderStandard* fstd = dynamic_cast<AliFemtoEventReaderStandard *> (fReader);
442 fstd->SetAODSource(fAOD);
443 fstd->SetInputType(AliFemtoEventReaderStandard::kAOD);
444 fManager->ProcessEvent();
449 // Post the output histogram list
450 PostData(0, fOutputList);
454 //________________________________________________________________________
455 void AliAnalysisTaskFemto::Terminate(Option_t *) {
456 // Do the final processing
461 //________________________________________________________________________
462 void AliAnalysisTaskFemto:: FinishTaskOutput() {
463 // Do the final processing
468 //________________________________________________________________________
469 void AliAnalysisTaskFemto::SetFemtoReaderESD(AliFemtoEventReaderESDChain *aReader)
471 AliInfo("Selecting Femto reader for ESD\n");
474 //________________________________________________________________________
475 void AliAnalysisTaskFemto::SetFemtoReaderESDKine(AliFemtoEventReaderESDChainKine *aReader)
477 AliInfo("Selecting Femto reader for ESD with Kinematics information\n");
480 //________________________________________________________________________
481 void AliAnalysisTaskFemto::SetFemtoReaderAOD(AliFemtoEventReaderAODChain *aReader)
483 AliInfo("Selecting Femto reader for AOD\n");
486 void AliAnalysisTaskFemto::SetFemtoReaderStandard(AliFemtoEventReaderStandard *aReader)
488 AliInfo("Selecting Standard all-purpose Femto reader\n");
491 void AliAnalysisTaskFemto::SetFemtoReaderKinematics(AliFemtoEventReaderKinematicsChain *aReader)
493 printf("Selecting Femto reader for Kinematics (Monte Carlo) information\n");
496 //________________________________________________________________________
497 void AliAnalysisTaskFemto::SetFemtoManager(AliFemtoManager *aManager)
500 AliInfo(Form("Got reader %p\n", (void *) aManager->EventReader()));
501 AliFemtoEventReaderESDChain *tReaderESDChain = dynamic_cast<AliFemtoEventReaderESDChain *> (aManager->EventReader());
502 AliFemtoEventReaderESDChainKine *tReaderESDChainKine = dynamic_cast<AliFemtoEventReaderESDChainKine *> (aManager->EventReader());
503 AliFemtoEventReaderAODChain *tReaderAODChain = dynamic_cast<AliFemtoEventReaderAODChain *> (aManager->EventReader());
504 AliFemtoEventReaderStandard *tReaderStandard = dynamic_cast<AliFemtoEventReaderStandard *> (aManager->EventReader());
505 AliFemtoEventReaderKinematicsChain *tReaderKineChain = dynamic_cast<AliFemtoEventReaderKinematicsChain *> (aManager->EventReader());
507 if ((!tReaderESDChain) && (!tReaderESDChainKine) && (!tReaderAODChain) && (!tReaderStandard) && (!tReaderKineChain)) {
508 AliWarning("No AliFemto event reader created. Will not run femto analysis.\n");
511 if (tReaderESDChain) SetFemtoReaderESD(tReaderESDChain);
512 if (tReaderESDChainKine) SetFemtoReaderESDKine(tReaderESDChainKine);
513 if (tReaderAODChain) SetFemtoReaderAOD(tReaderAODChain);
514 if (tReaderStandard) SetFemtoReaderStandard(tReaderStandard);
515 if (tReaderKineChain) SetFemtoReaderKinematics(tReaderKineChain);