ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2007, 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$ */

//-------------------------------------------------------------------------
//     Event handler for multiple VEvent input.
//     This class handles multiple inputs for event mixing. 
//     Author: Andreas Morsch, CERN
//-------------------------------------------------------------------------

#include "AliMultiEventInputHandler.h"
#include "AliVEvent.h"
#include "AliAODEvent.h"
#include "AliESDEvent.h"
#include "AliVEventPool.h"
#include "AliVCuts.h"
#include "AliLog.h"
#include <TObjArray.h>
#include <TTree.h>
#include <TList.h>
#include <TEntryList.h>


ClassImp(AliMultiEventInputHandler)

AliMultiEventInputHandler::AliMultiEventInputHandler() :
    AliInputEventHandler(),
    fBufferSize(0),
    fFormat(1),
    fNBuffered(0),
    fIndex(0),
    fCurrentBin(0),
    fCurrentEvt(0),
    fInit(0),
    fEventPool(0),
    fEventBuffer(0),
    fEventSkipped(0)
{
  // Default constructor
}

//______________________________________________________________________________
AliMultiEventInputHandler::AliMultiEventInputHandler(Int_t size, Int_t format) :
    AliInputEventHandler(),
    fBufferSize(size),
    fFormat(format),
    fNBuffered(0),
    fIndex(0),
    fCurrentBin(0),
    fCurrentEvt(0),
    fInit(0),
    fEventPool(0),
    fEventBuffer(0),
    fEventSkipped(0)
{
  // constructor
}

//______________________________________________________________________________
AliMultiEventInputHandler::AliMultiEventInputHandler(const char* name, const char* title, Int_t size, Int_t format):
    AliInputEventHandler(name, title),
    fBufferSize(size),
    fFormat(format),
    fNBuffered(0),
    fIndex(0),
    fCurrentBin(0),
    fCurrentEvt(0),
    fInit(0),
    fEventPool(0),
    fEventBuffer(0),
    fEventSkipped(0)
{
    // Constructor

}

//______________________________________________________________________________
AliMultiEventInputHandler::~AliMultiEventInputHandler() 
{
// Destructor
}

Bool_t AliMultiEventInputHandler::Init(TTree* tree, Option_t* /*opt*/)
{
    // Initialisation necessary for each new tree
    if (!fEventBuffer) {
	fEventBuffer = new AliVEvent*[fBufferSize];
	
	for (Int_t i = 0; i < fBufferSize; i++) 
	    if (fFormat == 1) {
		fEventBuffer[i] = new AliAODEvent();
	    } else if (fFormat == 0) {
		fEventBuffer[i] = new AliESDEvent();
	    } else{
		AliWarning(Form("Unknown Format %5d", fFormat));
	    }
    }
    

    fTree = tree;
    fInit = 1;
    
    if (!fTree) return kFALSE;
    for (Int_t i = 0; i < fBufferSize; i++) 
	fEventBuffer[i]->Clear();
    fIndex     = 0;
    fNBuffered = 1;
    return kTRUE;
}


Bool_t AliMultiEventInputHandler::Notify(const char */*path*/)
{
    // Connect to new tree

    TList* connectedList = (TList*) (fTree->GetUserInfo()->FindObject("AODObjectsConnectedToTree"));   
    if (connectedList && !fInit) {
	fEventBuffer[0]->ReadFromTree(fTree, "reconnect");
    } else {
	if (fInit) fEventBuffer[0]->ReadFromTree(fTree, "");
    }
    
    fCurrentEvt = 0;
    fInit = 0;
    
    return (kTRUE);
}

Bool_t AliMultiEventInputHandler::BeginEvent(Long64_t /*entry*/)
{
    // Actions before analysis of each event 
    //
    // Reset the number of events buffered for this bin to 0
    
    if (fCurrentBin != (fEventPool->BinNumber())) {
	fCurrentBin = fEventPool->BinNumber();
	fNBuffered = 0;
    }
  //
  // Event selection
  // 
    if (fFormat == 0) {
      fIsSelectedResult = 0;
      if (fEventCuts && !IsUserCallSelectionMask())
	fIsSelectedResult = 
	  fEventCuts->GetSelectionMask((AliESDEvent*)fEventBuffer[fIndex]); 
    }
    
    return kTRUE;
}

Bool_t AliMultiEventInputHandler::FinishEvent()
{
    // 
    // Connect the next event in the buffer to the tree
    if (!fEventSkipped) fIndex++;
    fIndex %= fBufferSize;
    AliInfo(Form("Connecting buffer entry %5d", fIndex));
    fEventBuffer[fIndex]->Clear();
    fCurrentEvt++;
    if (fEventBuffer[fIndex]->GetList() && fCurrentEvt > (fBufferSize - 1))
	fEventBuffer[fIndex]->GetList()->Delete();

    fEventBuffer[fIndex]->ReadFromTree(fTree, "reconnect");

    fNBuffered++;
    if (fNBuffered > fBufferSize) fNBuffered = fBufferSize;
    
    Int_t nmax = fTree->GetEntries();
    if (fTree->GetEntryList()) {
	nmax = (fTree->GetEntryList()->GetN());
    } else {
	if (fTree->GetTree()) nmax = fTree->GetTree()->GetEntries();
    }
    
    if (fCurrentEvt == nmax)
    {
	for (Int_t i = 0; i < fBufferSize; i++) {
	    fEventBuffer[i]->Clear();
	}
    }
    
    return (kTRUE);
}

AliVEvent* AliMultiEventInputHandler::GetEvent(Int_t iev) const
{
    // Get event number iev from buffer
    if ((iev < 0) || (iev >= fBufferSize))
    {
	AliWarning(Form("Event number out of range: %10d", iev));
	return 0;
    }
	
    iev = fIndex - (fBufferSize - 1 - iev);
    if (iev < 0) iev += fBufferSize;
    AliInfo(Form("Event index in buffer is %5d", iev));
    return (fEventBuffer[iev]);
}

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