ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */
 
#include <TROOT.h>
#include <TSystem.h>
#include <TInterpreter.h>
#include <TChain.h>
#include <TFile.h>
#include <TList.h>

#include "AliAnalysisTaskME.h"
#include "AliAnalysisManager.h"
#include "AliAnalysisDataSlot.h"
#include "AliAODEvent.h"
#include "AliVEvent.h"
#include "AliAODHandler.h"
#include "AliMultiEventInputHandler.h"
#include "AliLog.h"


ClassImp(AliAnalysisTaskME)

////////////////////////////////////////////////////////////////////////

AliAnalysisTaskME::AliAnalysisTaskME():
    AliAnalysisTask(),
    fDebug(0),
    fEntry(0),
    fFreshBufferOnly(kFALSE),
    fInputHandler(0x0),
    fOutputAOD(0x0),
    fTreeA(0x0),
    fOfflineTriggerMask(0)
{
  // Default constructor
}

AliAnalysisTaskME::AliAnalysisTaskME(const char* name):
    AliAnalysisTask(name, "AnalysisTaskME"),
    fDebug(0),
    fEntry(0),
    fFreshBufferOnly(kFALSE),
    fInputHandler(0x0),
    fOutputAOD(0x0),
    fTreeA(0x0),
    fOfflineTriggerMask(0)
{
  // Default constructor
    DefineInput (0, TChain::Class());
    DefineOutput(0,  TTree::Class());
}

AliAnalysisTaskME::AliAnalysisTaskME(const AliAnalysisTaskME& obj):
    AliAnalysisTask(obj),
    fDebug(0),
    fEntry(0),
    fFreshBufferOnly(kFALSE),
    fInputHandler(0x0),
    fOutputAOD(0x0),
    fTreeA(0x0),
    fOfflineTriggerMask(0)
{
// Copy constructor
    fDebug        = obj.fDebug;
    fEntry        = obj.fEntry;
    fInputHandler = obj.fInputHandler;
    fOutputAOD    = obj.fOutputAOD;
    fTreeA        = obj.fTreeA; 
    fOfflineTriggerMask = obj.fOfflineTriggerMask;
}


AliAnalysisTaskME& AliAnalysisTaskME::operator=(const AliAnalysisTaskME& other)
{
// Assignment
    if (this != &other) {
	AliAnalysisTask::operator=(other);
	fDebug           = other.fDebug;
	fEntry           = other.fEntry;
	fFreshBufferOnly = other.fFreshBufferOnly;
	fInputHandler    = other.fInputHandler;
	fOutputAOD       = other.fOutputAOD;
	fTreeA           = other.fTreeA;    
	fOfflineTriggerMask = other.fOfflineTriggerMask;
    }
    return *this;
}


void AliAnalysisTaskME::ConnectInputData(Option_t* /*option*/)
{
// Connect the input data
    if (fDebug > 1) printf("AnalysisTaskME::ConnectInputData() \n");
//
//  Multi AOD
//
    fInputHandler = dynamic_cast<AliMultiEventInputHandler*> 
	((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
    if (fInputHandler == 0) {
	AliFatal("Event Handler has to be MultiEventInputHandler !");
    } else {
	// Check that we have an event pool
	if (!fInputHandler->GetEventPool()) {
	    fInputHandler->SetEventPool(AliAnalysisManager::GetAnalysisManager()->GetEventPool());
	    if (!fInputHandler->GetEventPool()) 
		AliFatal("MultiEventInputHandler has no EventPool connected !");
	}
    }
}

void AliAnalysisTaskME::CreateOutputObjects()
{
// Create the output container
//
//  Default AOD
    if (fDebug > 1) printf("AnalysisTaskME::CreateOutPutData() \n");

    AliAODHandler* handler = (AliAODHandler*) 
	((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
    
    if (handler) {
	fOutputAOD   = handler->GetAOD();
	fTreeA = handler->GetTree();
    } else {
	AliWarning("No AOD Event Handler connected.") ; 
    }
    UserCreateOutputObjects();
}

void AliAnalysisTaskME::Exec(Option_t* option)
{
//
// Exec analysis of one event

    if (fDebug > 1) AliInfo("AliAnalysisTaskME::Exec() \n");
    if( fInputHandler ) 
       fEntry = fInputHandler->GetReadEntry();
    if ( !((Entry()-1)%100) && fDebug > 0) 
         AliInfo(Form("%s ----> Processing event # %lld", CurrentFileName(), Entry()));

    AliAODHandler* outputHandler = (AliAODHandler*) 
	((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());         
//
// Was event selected ? If no event selection mechanism, the event SHOULD be selected (AG)
    UInt_t isSelected = AliVEvent::kAny;
    if(fInputHandler && fInputHandler->GetEventSelection()) {
      // Get the actual offline trigger mask for the event and AND it with the
      // requested mask. If no mask requested select by default the event.
      if (fOfflineTriggerMask)
	isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
    }
    
    if (!isSelected) { 
	if (fDebug > 1) AliInfo("Event rejected \n");
	fInputHandler->EventSkipped();
	return;
    }
// Call the user analysis    
    
    if (fInputHandler && fInputHandler->IsBufferReady()) {
	if ((fFreshBufferOnly && fInputHandler->IsFreshBuffer()) || !fFreshBufferOnly)
	{
	    if (outputHandler) outputHandler->SetFillAOD(kTRUE);
	    UserExec(option);
	    // Added protection in case the derived task is not an AOD producer.
	    AliAnalysisDataSlot *out0 = GetOutputSlot(0);
	    if (out0 && out0->IsConnected()) PostData(0, fTreeA);
	} else {
	    if (outputHandler) outputHandler->SetFillAOD(kFALSE);
	}
    } else {
	AliInfo(Form("Waiting for buffer to be ready !\n"));
    }
}

const char* AliAnalysisTaskME::CurrentFileName()
{
// Returns the current file name    
    if(fInputHandler )
	return fInputHandler->GetTree()->GetCurrentFile()->GetName();
    else return "";
}

void AliAnalysisTaskME::AddAODBranch(const char* cname, void* addobj, const char *fname)
{
    // Add a new branch to the aod tree
    AliAODHandler* handler = (AliAODHandler*) 
	((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
    if (handler) {
	handler->AddBranch(cname, addobj, fname);
    }
}

AliVEvent*  AliAnalysisTaskME::GetEvent(Int_t iev)
{
    // Get an event from the input handler
    return (fInputHandler->GetEvent(iev));
}

 AliAnalysisTaskME.cxx:1
 AliAnalysisTaskME.cxx:2
 AliAnalysisTaskME.cxx:3
 AliAnalysisTaskME.cxx:4
 AliAnalysisTaskME.cxx:5
 AliAnalysisTaskME.cxx:6
 AliAnalysisTaskME.cxx:7
 AliAnalysisTaskME.cxx:8
 AliAnalysisTaskME.cxx:9
 AliAnalysisTaskME.cxx:10
 AliAnalysisTaskME.cxx:11
 AliAnalysisTaskME.cxx:12
 AliAnalysisTaskME.cxx:13
 AliAnalysisTaskME.cxx:14
 AliAnalysisTaskME.cxx:15
 AliAnalysisTaskME.cxx:16
 AliAnalysisTaskME.cxx:17
 AliAnalysisTaskME.cxx:18
 AliAnalysisTaskME.cxx:19
 AliAnalysisTaskME.cxx:20
 AliAnalysisTaskME.cxx:21
 AliAnalysisTaskME.cxx:22
 AliAnalysisTaskME.cxx:23
 AliAnalysisTaskME.cxx:24
 AliAnalysisTaskME.cxx:25
 AliAnalysisTaskME.cxx:26
 AliAnalysisTaskME.cxx:27
 AliAnalysisTaskME.cxx:28
 AliAnalysisTaskME.cxx:29
 AliAnalysisTaskME.cxx:30
 AliAnalysisTaskME.cxx:31
 AliAnalysisTaskME.cxx:32
 AliAnalysisTaskME.cxx:33
 AliAnalysisTaskME.cxx:34
 AliAnalysisTaskME.cxx:35
 AliAnalysisTaskME.cxx:36
 AliAnalysisTaskME.cxx:37
 AliAnalysisTaskME.cxx:38
 AliAnalysisTaskME.cxx:39
 AliAnalysisTaskME.cxx:40
 AliAnalysisTaskME.cxx:41
 AliAnalysisTaskME.cxx:42
 AliAnalysisTaskME.cxx:43
 AliAnalysisTaskME.cxx:44
 AliAnalysisTaskME.cxx:45
 AliAnalysisTaskME.cxx:46
 AliAnalysisTaskME.cxx:47
 AliAnalysisTaskME.cxx:48
 AliAnalysisTaskME.cxx:49
 AliAnalysisTaskME.cxx:50
 AliAnalysisTaskME.cxx:51
 AliAnalysisTaskME.cxx:52
 AliAnalysisTaskME.cxx:53
 AliAnalysisTaskME.cxx:54
 AliAnalysisTaskME.cxx:55
 AliAnalysisTaskME.cxx:56
 AliAnalysisTaskME.cxx:57
 AliAnalysisTaskME.cxx:58
 AliAnalysisTaskME.cxx:59
 AliAnalysisTaskME.cxx:60
 AliAnalysisTaskME.cxx:61
 AliAnalysisTaskME.cxx:62
 AliAnalysisTaskME.cxx:63
 AliAnalysisTaskME.cxx:64
 AliAnalysisTaskME.cxx:65
 AliAnalysisTaskME.cxx:66
 AliAnalysisTaskME.cxx:67
 AliAnalysisTaskME.cxx:68
 AliAnalysisTaskME.cxx:69
 AliAnalysisTaskME.cxx:70
 AliAnalysisTaskME.cxx:71
 AliAnalysisTaskME.cxx:72
 AliAnalysisTaskME.cxx:73
 AliAnalysisTaskME.cxx:74
 AliAnalysisTaskME.cxx:75
 AliAnalysisTaskME.cxx:76
 AliAnalysisTaskME.cxx:77
 AliAnalysisTaskME.cxx:78
 AliAnalysisTaskME.cxx:79
 AliAnalysisTaskME.cxx:80
 AliAnalysisTaskME.cxx:81
 AliAnalysisTaskME.cxx:82
 AliAnalysisTaskME.cxx:83
 AliAnalysisTaskME.cxx:84
 AliAnalysisTaskME.cxx:85
 AliAnalysisTaskME.cxx:86
 AliAnalysisTaskME.cxx:87
 AliAnalysisTaskME.cxx:88
 AliAnalysisTaskME.cxx:89
 AliAnalysisTaskME.cxx:90
 AliAnalysisTaskME.cxx:91
 AliAnalysisTaskME.cxx:92
 AliAnalysisTaskME.cxx:93
 AliAnalysisTaskME.cxx:94
 AliAnalysisTaskME.cxx:95
 AliAnalysisTaskME.cxx:96
 AliAnalysisTaskME.cxx:97
 AliAnalysisTaskME.cxx:98
 AliAnalysisTaskME.cxx:99
 AliAnalysisTaskME.cxx:100
 AliAnalysisTaskME.cxx:101
 AliAnalysisTaskME.cxx:102
 AliAnalysisTaskME.cxx:103
 AliAnalysisTaskME.cxx:104
 AliAnalysisTaskME.cxx:105
 AliAnalysisTaskME.cxx:106
 AliAnalysisTaskME.cxx:107
 AliAnalysisTaskME.cxx:108
 AliAnalysisTaskME.cxx:109
 AliAnalysisTaskME.cxx:110
 AliAnalysisTaskME.cxx:111
 AliAnalysisTaskME.cxx:112
 AliAnalysisTaskME.cxx:113
 AliAnalysisTaskME.cxx:114
 AliAnalysisTaskME.cxx:115
 AliAnalysisTaskME.cxx:116
 AliAnalysisTaskME.cxx:117
 AliAnalysisTaskME.cxx:118
 AliAnalysisTaskME.cxx:119
 AliAnalysisTaskME.cxx:120
 AliAnalysisTaskME.cxx:121
 AliAnalysisTaskME.cxx:122
 AliAnalysisTaskME.cxx:123
 AliAnalysisTaskME.cxx:124
 AliAnalysisTaskME.cxx:125
 AliAnalysisTaskME.cxx:126
 AliAnalysisTaskME.cxx:127
 AliAnalysisTaskME.cxx:128
 AliAnalysisTaskME.cxx:129
 AliAnalysisTaskME.cxx:130
 AliAnalysisTaskME.cxx:131
 AliAnalysisTaskME.cxx:132
 AliAnalysisTaskME.cxx:133
 AliAnalysisTaskME.cxx:134
 AliAnalysisTaskME.cxx:135
 AliAnalysisTaskME.cxx:136
 AliAnalysisTaskME.cxx:137
 AliAnalysisTaskME.cxx:138
 AliAnalysisTaskME.cxx:139
 AliAnalysisTaskME.cxx:140
 AliAnalysisTaskME.cxx:141
 AliAnalysisTaskME.cxx:142
 AliAnalysisTaskME.cxx:143
 AliAnalysisTaskME.cxx:144
 AliAnalysisTaskME.cxx:145
 AliAnalysisTaskME.cxx:146
 AliAnalysisTaskME.cxx:147
 AliAnalysisTaskME.cxx:148
 AliAnalysisTaskME.cxx:149
 AliAnalysisTaskME.cxx:150
 AliAnalysisTaskME.cxx:151
 AliAnalysisTaskME.cxx:152
 AliAnalysisTaskME.cxx:153
 AliAnalysisTaskME.cxx:154
 AliAnalysisTaskME.cxx:155
 AliAnalysisTaskME.cxx:156
 AliAnalysisTaskME.cxx:157
 AliAnalysisTaskME.cxx:158
 AliAnalysisTaskME.cxx:159
 AliAnalysisTaskME.cxx:160
 AliAnalysisTaskME.cxx:161
 AliAnalysisTaskME.cxx:162
 AliAnalysisTaskME.cxx:163
 AliAnalysisTaskME.cxx:164
 AliAnalysisTaskME.cxx:165
 AliAnalysisTaskME.cxx:166
 AliAnalysisTaskME.cxx:167
 AliAnalysisTaskME.cxx:168
 AliAnalysisTaskME.cxx:169
 AliAnalysisTaskME.cxx:170
 AliAnalysisTaskME.cxx:171
 AliAnalysisTaskME.cxx:172
 AliAnalysisTaskME.cxx:173
 AliAnalysisTaskME.cxx:174
 AliAnalysisTaskME.cxx:175
 AliAnalysisTaskME.cxx:176
 AliAnalysisTaskME.cxx:177
 AliAnalysisTaskME.cxx:178
 AliAnalysisTaskME.cxx:179
 AliAnalysisTaskME.cxx:180
 AliAnalysisTaskME.cxx:181
 AliAnalysisTaskME.cxx:182
 AliAnalysisTaskME.cxx:183
 AliAnalysisTaskME.cxx:184
 AliAnalysisTaskME.cxx:185
 AliAnalysisTaskME.cxx:186
 AliAnalysisTaskME.cxx:187
 AliAnalysisTaskME.cxx:188
 AliAnalysisTaskME.cxx:189
 AliAnalysisTaskME.cxx:190
 AliAnalysisTaskME.cxx:191
 AliAnalysisTaskME.cxx:192
 AliAnalysisTaskME.cxx:193
 AliAnalysisTaskME.cxx:194
 AliAnalysisTaskME.cxx:195
 AliAnalysisTaskME.cxx:196
 AliAnalysisTaskME.cxx:197
 AliAnalysisTaskME.cxx:198
 AliAnalysisTaskME.cxx:199
 AliAnalysisTaskME.cxx:200
 AliAnalysisTaskME.cxx:201
 AliAnalysisTaskME.cxx:202
 AliAnalysisTaskME.cxx:203
 AliAnalysisTaskME.cxx:204
 AliAnalysisTaskME.cxx:205
 AliAnalysisTaskME.cxx:206
 AliAnalysisTaskME.cxx:207
 AliAnalysisTaskME.cxx:208
 AliAnalysisTaskME.cxx:209
 AliAnalysisTaskME.cxx:210
 AliAnalysisTaskME.cxx:211
 AliAnalysisTaskME.cxx:212
 AliAnalysisTaskME.cxx:213