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$ */

//////////////////////////////////////////////////////////////////////////
//
//  Base class for filtering friends
//
//////////////////////////////////////////////////////////////////////////
 
#include <TChain.h>
#include <TFile.h>
#include <TList.h>

#include "AliAnalysisTaskFilter.h"
#include "AliAnalysisManager.h"
#include "AliAnalysisDataSlot.h"
#include "AliESDEvent.h"
#include "AliESD.h"
#include "AliVEvent.h"
#include "AliESDHandler.h"
#include "AliInputEventHandler.h"
#include "AliLog.h"
#include "AliESDfriend.h"
#include "AliESDfriendTrack.h"


ClassImp(AliAnalysisTaskFilter)

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

AliAnalysisTaskFilter::AliAnalysisTaskFilter():
	AliAnalysisTask(),
	fDebug(0),
	fEntry(0),
	fInputEvent(0x0),
	fInputHandler(0x0),
	fOutputESDfriend(0x0),
	fTreeEF(0x0),
	fInputESDfriend(0x0)
{
	//
	// Default constructor
	//
}

//______________________________________________________________________

AliAnalysisTaskFilter::AliAnalysisTaskFilter(const char* name):
	AliAnalysisTask(name, "AnalysisTaskFilter"),
	fDebug(0),
	fEntry(0),
	fInputEvent(0x0),
	fInputHandler(0x0),
	fOutputESDfriend(0x0),
	fTreeEF(0x0),
	fInputESDfriend(0x0)
{
	//
	// Default constructor
	//

	DefineInput (0, TChain::Class());
	DefineOutput(0,  TTree::Class());
}

//______________________________________________________________________

AliAnalysisTaskFilter::AliAnalysisTaskFilter(const AliAnalysisTaskFilter& obj):
	AliAnalysisTask(obj),
	fDebug(0),
	fEntry(0),
	fInputEvent(0x0),
	fInputHandler(0x0),
	fOutputESDfriend(0x0),
	fTreeEF(0x0),
	fInputESDfriend(0x0)
{
	//
	// Copy constructor
	//

	fDebug        = obj.fDebug;
	fEntry        = obj.fEntry;
	fInputEvent   = obj.fInputEvent;
	fInputHandler = obj.fInputHandler;
	fOutputESDfriend = obj.fOutputESDfriend;
	fTreeEF        = obj.fTreeEF;    
	fInputESDfriend = obj.fInputESDfriend;
}


//______________________________________________________________________

AliAnalysisTaskFilter& AliAnalysisTaskFilter::operator=(const AliAnalysisTaskFilter& other)
{
	//
	// Assignment
	//

	if (&other != this) {
		AliAnalysisTask::operator=(other);
		fDebug        = other.fDebug;
		fEntry        = other.fEntry;
		fInputEvent   = other.fInputEvent;
		fInputHandler = other.fInputHandler;
		fOutputESDfriend = other.fOutputESDfriend;
		fTreeEF        = other.fTreeEF;    
		fInputESDfriend = other.fInputESDfriend;
	}
	return *this;
}


//______________________________________________________________________

void AliAnalysisTaskFilter::ConnectInputData(Option_t* /*option*/)
{
	//
	// Connect the input data
	//

	if (fDebug > 1) printf("AnalysisTaskFilter::ConnectInputData() \n");
	fInputHandler = (AliInputEventHandler*) 
		((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
	if (fInputHandler) {
		fInputEvent = fInputHandler->GetEvent();
		if (fInputEvent){
			fInputESDfriend = (AliESDfriend*)(fInputEvent->FindListObject("AliESDfriend"));
			if (!fInputESDfriend){
				AliError("No friend found");
			}
		}
		else {
			AliError("No Input Event found, the friend will remain empty");
		}
	} 
	else {
		AliError("No Input Event Handler connected") ; 
		return ; 
	}
}

//______________________________________________________________________

void AliAnalysisTaskFilter::CreateOutputObjects()
{
	//
	// Create the output container
	//

	if (fDebug > 1) printf("AnalysisTaskFilter::CreateOutPutData() \n");

	AliESDHandler* handler = (AliESDHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
    
	if (handler) {
		fTreeEF = handler->GetTree();
	}
	else {
		AliWarning("No AOD Event Handler connected.") ; 
	}

	UserCreateOutputObjects();
}

//______________________________________________________________________

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

	if (fDebug > 1) AliInfo("AliAnalysisTaskFilter::Exec() \n");

	if( fInputHandler ) {
		fEntry = fInputHandler->GetReadEntry();
	}
    
	   
	if ( !((Entry()-1)%100) && fDebug > 0) {
		AliInfo(Form("%s ----> Processing event # %lld", CurrentFileName(), Entry()));
	}
	AliESDHandler* handler = (AliESDHandler*)((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
	
	if (UserSelectESDfriendForCurrentEvent()){
		// Call the user analysis only if the event was selected   
		handler->SelectEventForFriends();
		fOutputESDfriend   = handler->GetESDfriend();
		UserExec(option);
		// copy the VZERO friend only if it is not already there
		if (fOutputESDfriend->GetVZEROfriend() == 0x0){
			AliDebug(2,"Copying VZERO friend object");
			AliESDVZEROfriend* vZEROfriend = fInputESDfriend->GetVZEROfriend();
			fOutputESDfriend->SetVZEROfriend(vZEROfriend);
		}
	}
	else {
		// Event not selected
		AliDebug(2,"The event was not selected");
	}

	AliAnalysisDataSlot *out0 = GetOutputSlot(0);
	if (out0 && out0->IsConnected()) PostData(0, fTreeEF);    
}

//______________________________________________________________________

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

//______________________________________________________________________

void AliAnalysisTaskFilter::AddFriendTrackAt(AliESDfriendTrack* t, Int_t index)
{
	//
	// Adds the friend track at the i-th position in the TClonesArray
	// of the ESD friend tracks
	//

	AliESDfriendTrack* currentTrack = (AliESDfriendTrack*)fOutputESDfriend->GetTrack(index);
	if(currentTrack){
		if (currentTrack->TestSkipBit()){
			AliDebug(2,Form("Friend at index %d already there but dummy - the skip bit will be set to FALSE", index));
			t->SetSkipBit(kFALSE);
		}
		else{
			AliDebug(2,Form("Friend at index %d already there and not dummy", index));
			return;
		}
	}
	else{
		AliDebug(2,Form("Track at %d not there yet ",index));
	}
	AliDebug(2,Form("Adding track at %d",index));
	fOutputESDfriend->AddTrackAt(t,index);
	return;
}

//______________________________________________________________________

void AliAnalysisTaskFilter::SkipFriendTrackAt(Int_t index)
{
	//
	// Skip the friend track at the i-th position in the TClonesArray
	// of the ESD friend tracks
	//

	AliESDfriendTrack* currentTrack = (AliESDfriendTrack*)fOutputESDfriend->GetTrack(index);
	if (currentTrack){
		AliDebug(2,Form("Track already there (no matter what validity) at %d, keeping it as it is", index));
	}
	else {
		AliDebug(2,Form("Adding NULL track at %d, and setting skip bit to TRUE",index));
		AliESDfriendTrack* tNull = new AliESDfriendTrack();
		tNull->SetSkipBit(kTRUE);
		fOutputESDfriend->AddTrackAt(tNull,index);
	}
	return;
}
 AliAnalysisTaskFilter.cxx:1
 AliAnalysisTaskFilter.cxx:2
 AliAnalysisTaskFilter.cxx:3
 AliAnalysisTaskFilter.cxx:4
 AliAnalysisTaskFilter.cxx:5
 AliAnalysisTaskFilter.cxx:6
 AliAnalysisTaskFilter.cxx:7
 AliAnalysisTaskFilter.cxx:8
 AliAnalysisTaskFilter.cxx:9
 AliAnalysisTaskFilter.cxx:10
 AliAnalysisTaskFilter.cxx:11
 AliAnalysisTaskFilter.cxx:12
 AliAnalysisTaskFilter.cxx:13
 AliAnalysisTaskFilter.cxx:14
 AliAnalysisTaskFilter.cxx:15
 AliAnalysisTaskFilter.cxx:16
 AliAnalysisTaskFilter.cxx:17
 AliAnalysisTaskFilter.cxx:18
 AliAnalysisTaskFilter.cxx:19
 AliAnalysisTaskFilter.cxx:20
 AliAnalysisTaskFilter.cxx:21
 AliAnalysisTaskFilter.cxx:22
 AliAnalysisTaskFilter.cxx:23
 AliAnalysisTaskFilter.cxx:24
 AliAnalysisTaskFilter.cxx:25
 AliAnalysisTaskFilter.cxx:26
 AliAnalysisTaskFilter.cxx:27
 AliAnalysisTaskFilter.cxx:28
 AliAnalysisTaskFilter.cxx:29
 AliAnalysisTaskFilter.cxx:30
 AliAnalysisTaskFilter.cxx:31
 AliAnalysisTaskFilter.cxx:32
 AliAnalysisTaskFilter.cxx:33
 AliAnalysisTaskFilter.cxx:34
 AliAnalysisTaskFilter.cxx:35
 AliAnalysisTaskFilter.cxx:36
 AliAnalysisTaskFilter.cxx:37
 AliAnalysisTaskFilter.cxx:38
 AliAnalysisTaskFilter.cxx:39
 AliAnalysisTaskFilter.cxx:40
 AliAnalysisTaskFilter.cxx:41
 AliAnalysisTaskFilter.cxx:42
 AliAnalysisTaskFilter.cxx:43
 AliAnalysisTaskFilter.cxx:44
 AliAnalysisTaskFilter.cxx:45
 AliAnalysisTaskFilter.cxx:46
 AliAnalysisTaskFilter.cxx:47
 AliAnalysisTaskFilter.cxx:48
 AliAnalysisTaskFilter.cxx:49
 AliAnalysisTaskFilter.cxx:50
 AliAnalysisTaskFilter.cxx:51
 AliAnalysisTaskFilter.cxx:52
 AliAnalysisTaskFilter.cxx:53
 AliAnalysisTaskFilter.cxx:54
 AliAnalysisTaskFilter.cxx:55
 AliAnalysisTaskFilter.cxx:56
 AliAnalysisTaskFilter.cxx:57
 AliAnalysisTaskFilter.cxx:58
 AliAnalysisTaskFilter.cxx:59
 AliAnalysisTaskFilter.cxx:60
 AliAnalysisTaskFilter.cxx:61
 AliAnalysisTaskFilter.cxx:62
 AliAnalysisTaskFilter.cxx:63
 AliAnalysisTaskFilter.cxx:64
 AliAnalysisTaskFilter.cxx:65
 AliAnalysisTaskFilter.cxx:66
 AliAnalysisTaskFilter.cxx:67
 AliAnalysisTaskFilter.cxx:68
 AliAnalysisTaskFilter.cxx:69
 AliAnalysisTaskFilter.cxx:70
 AliAnalysisTaskFilter.cxx:71
 AliAnalysisTaskFilter.cxx:72
 AliAnalysisTaskFilter.cxx:73
 AliAnalysisTaskFilter.cxx:74
 AliAnalysisTaskFilter.cxx:75
 AliAnalysisTaskFilter.cxx:76
 AliAnalysisTaskFilter.cxx:77
 AliAnalysisTaskFilter.cxx:78
 AliAnalysisTaskFilter.cxx:79
 AliAnalysisTaskFilter.cxx:80
 AliAnalysisTaskFilter.cxx:81
 AliAnalysisTaskFilter.cxx:82
 AliAnalysisTaskFilter.cxx:83
 AliAnalysisTaskFilter.cxx:84
 AliAnalysisTaskFilter.cxx:85
 AliAnalysisTaskFilter.cxx:86
 AliAnalysisTaskFilter.cxx:87
 AliAnalysisTaskFilter.cxx:88
 AliAnalysisTaskFilter.cxx:89
 AliAnalysisTaskFilter.cxx:90
 AliAnalysisTaskFilter.cxx:91
 AliAnalysisTaskFilter.cxx:92
 AliAnalysisTaskFilter.cxx:93
 AliAnalysisTaskFilter.cxx:94
 AliAnalysisTaskFilter.cxx:95
 AliAnalysisTaskFilter.cxx:96
 AliAnalysisTaskFilter.cxx:97
 AliAnalysisTaskFilter.cxx:98
 AliAnalysisTaskFilter.cxx:99
 AliAnalysisTaskFilter.cxx:100
 AliAnalysisTaskFilter.cxx:101
 AliAnalysisTaskFilter.cxx:102
 AliAnalysisTaskFilter.cxx:103
 AliAnalysisTaskFilter.cxx:104
 AliAnalysisTaskFilter.cxx:105
 AliAnalysisTaskFilter.cxx:106
 AliAnalysisTaskFilter.cxx:107
 AliAnalysisTaskFilter.cxx:108
 AliAnalysisTaskFilter.cxx:109
 AliAnalysisTaskFilter.cxx:110
 AliAnalysisTaskFilter.cxx:111
 AliAnalysisTaskFilter.cxx:112
 AliAnalysisTaskFilter.cxx:113
 AliAnalysisTaskFilter.cxx:114
 AliAnalysisTaskFilter.cxx:115
 AliAnalysisTaskFilter.cxx:116
 AliAnalysisTaskFilter.cxx:117
 AliAnalysisTaskFilter.cxx:118
 AliAnalysisTaskFilter.cxx:119
 AliAnalysisTaskFilter.cxx:120
 AliAnalysisTaskFilter.cxx:121
 AliAnalysisTaskFilter.cxx:122
 AliAnalysisTaskFilter.cxx:123
 AliAnalysisTaskFilter.cxx:124
 AliAnalysisTaskFilter.cxx:125
 AliAnalysisTaskFilter.cxx:126
 AliAnalysisTaskFilter.cxx:127
 AliAnalysisTaskFilter.cxx:128
 AliAnalysisTaskFilter.cxx:129
 AliAnalysisTaskFilter.cxx:130
 AliAnalysisTaskFilter.cxx:131
 AliAnalysisTaskFilter.cxx:132
 AliAnalysisTaskFilter.cxx:133
 AliAnalysisTaskFilter.cxx:134
 AliAnalysisTaskFilter.cxx:135
 AliAnalysisTaskFilter.cxx:136
 AliAnalysisTaskFilter.cxx:137
 AliAnalysisTaskFilter.cxx:138
 AliAnalysisTaskFilter.cxx:139
 AliAnalysisTaskFilter.cxx:140
 AliAnalysisTaskFilter.cxx:141
 AliAnalysisTaskFilter.cxx:142
 AliAnalysisTaskFilter.cxx:143
 AliAnalysisTaskFilter.cxx:144
 AliAnalysisTaskFilter.cxx:145
 AliAnalysisTaskFilter.cxx:146
 AliAnalysisTaskFilter.cxx:147
 AliAnalysisTaskFilter.cxx:148
 AliAnalysisTaskFilter.cxx:149
 AliAnalysisTaskFilter.cxx:150
 AliAnalysisTaskFilter.cxx:151
 AliAnalysisTaskFilter.cxx:152
 AliAnalysisTaskFilter.cxx:153
 AliAnalysisTaskFilter.cxx:154
 AliAnalysisTaskFilter.cxx:155
 AliAnalysisTaskFilter.cxx:156
 AliAnalysisTaskFilter.cxx:157
 AliAnalysisTaskFilter.cxx:158
 AliAnalysisTaskFilter.cxx:159
 AliAnalysisTaskFilter.cxx:160
 AliAnalysisTaskFilter.cxx:161
 AliAnalysisTaskFilter.cxx:162
 AliAnalysisTaskFilter.cxx:163
 AliAnalysisTaskFilter.cxx:164
 AliAnalysisTaskFilter.cxx:165
 AliAnalysisTaskFilter.cxx:166
 AliAnalysisTaskFilter.cxx:167
 AliAnalysisTaskFilter.cxx:168
 AliAnalysisTaskFilter.cxx:169
 AliAnalysisTaskFilter.cxx:170
 AliAnalysisTaskFilter.cxx:171
 AliAnalysisTaskFilter.cxx:172
 AliAnalysisTaskFilter.cxx:173
 AliAnalysisTaskFilter.cxx:174
 AliAnalysisTaskFilter.cxx:175
 AliAnalysisTaskFilter.cxx:176
 AliAnalysisTaskFilter.cxx:177
 AliAnalysisTaskFilter.cxx:178
 AliAnalysisTaskFilter.cxx:179
 AliAnalysisTaskFilter.cxx:180
 AliAnalysisTaskFilter.cxx:181
 AliAnalysisTaskFilter.cxx:182
 AliAnalysisTaskFilter.cxx:183
 AliAnalysisTaskFilter.cxx:184
 AliAnalysisTaskFilter.cxx:185
 AliAnalysisTaskFilter.cxx:186
 AliAnalysisTaskFilter.cxx:187
 AliAnalysisTaskFilter.cxx:188
 AliAnalysisTaskFilter.cxx:189
 AliAnalysisTaskFilter.cxx:190
 AliAnalysisTaskFilter.cxx:191
 AliAnalysisTaskFilter.cxx:192
 AliAnalysisTaskFilter.cxx:193
 AliAnalysisTaskFilter.cxx:194
 AliAnalysisTaskFilter.cxx:195
 AliAnalysisTaskFilter.cxx:196
 AliAnalysisTaskFilter.cxx:197
 AliAnalysisTaskFilter.cxx:198
 AliAnalysisTaskFilter.cxx:199
 AliAnalysisTaskFilter.cxx:200
 AliAnalysisTaskFilter.cxx:201
 AliAnalysisTaskFilter.cxx:202
 AliAnalysisTaskFilter.cxx:203
 AliAnalysisTaskFilter.cxx:204
 AliAnalysisTaskFilter.cxx:205
 AliAnalysisTaskFilter.cxx:206
 AliAnalysisTaskFilter.cxx:207
 AliAnalysisTaskFilter.cxx:208
 AliAnalysisTaskFilter.cxx:209
 AliAnalysisTaskFilter.cxx:210
 AliAnalysisTaskFilter.cxx:211
 AliAnalysisTaskFilter.cxx:212
 AliAnalysisTaskFilter.cxx:213
 AliAnalysisTaskFilter.cxx:214
 AliAnalysisTaskFilter.cxx:215
 AliAnalysisTaskFilter.cxx:216
 AliAnalysisTaskFilter.cxx:217
 AliAnalysisTaskFilter.cxx:218
 AliAnalysisTaskFilter.cxx:219
 AliAnalysisTaskFilter.cxx:220
 AliAnalysisTaskFilter.cxx:221
 AliAnalysisTaskFilter.cxx:222
 AliAnalysisTaskFilter.cxx:223
 AliAnalysisTaskFilter.cxx:224
 AliAnalysisTaskFilter.cxx:225
 AliAnalysisTaskFilter.cxx:226
 AliAnalysisTaskFilter.cxx:227
 AliAnalysisTaskFilter.cxx:228
 AliAnalysisTaskFilter.cxx:229
 AliAnalysisTaskFilter.cxx:230
 AliAnalysisTaskFilter.cxx:231
 AliAnalysisTaskFilter.cxx:232
 AliAnalysisTaskFilter.cxx:233
 AliAnalysisTaskFilter.cxx:234
 AliAnalysisTaskFilter.cxx:235
 AliAnalysisTaskFilter.cxx:236
 AliAnalysisTaskFilter.cxx:237
 AliAnalysisTaskFilter.cxx:238
 AliAnalysisTaskFilter.cxx:239
 AliAnalysisTaskFilter.cxx:240
 AliAnalysisTaskFilter.cxx:241
 AliAnalysisTaskFilter.cxx:242
 AliAnalysisTaskFilter.cxx:243
 AliAnalysisTaskFilter.cxx:244
 AliAnalysisTaskFilter.cxx:245
 AliAnalysisTaskFilter.cxx:246
 AliAnalysisTaskFilter.cxx:247
 AliAnalysisTaskFilter.cxx:248
 AliAnalysisTaskFilter.cxx:249
 AliAnalysisTaskFilter.cxx:250
 AliAnalysisTaskFilter.cxx:251
 AliAnalysisTaskFilter.cxx:252
 AliAnalysisTaskFilter.cxx:253
 AliAnalysisTaskFilter.cxx:254
 AliAnalysisTaskFilter.cxx:255
 AliAnalysisTaskFilter.cxx:256
 AliAnalysisTaskFilter.cxx:257
 AliAnalysisTaskFilter.cxx:258
 AliAnalysisTaskFilter.cxx:259
 AliAnalysisTaskFilter.cxx:260
 AliAnalysisTaskFilter.cxx:261
 AliAnalysisTaskFilter.cxx:262
 AliAnalysisTaskFilter.cxx:263
 AliAnalysisTaskFilter.cxx:264
 AliAnalysisTaskFilter.cxx:265
 AliAnalysisTaskFilter.cxx:266
 AliAnalysisTaskFilter.cxx:267
 AliAnalysisTaskFilter.cxx:268
 AliAnalysisTaskFilter.cxx:269
 AliAnalysisTaskFilter.cxx:270
 AliAnalysisTaskFilter.cxx:271
 AliAnalysisTaskFilter.cxx:272
 AliAnalysisTaskFilter.cxx:273
 AliAnalysisTaskFilter.cxx:274
 AliAnalysisTaskFilter.cxx:275
 AliAnalysisTaskFilter.cxx:276
 AliAnalysisTaskFilter.cxx:277
 AliAnalysisTaskFilter.cxx:278
 AliAnalysisTaskFilter.cxx:279