ROOT logo
//
// Class AliMultiInputEventHandler
//
// Multi input event handler
// TODO example
// author:
//        Martin Vala (martin.vala@cern.ch)
//

#include "AliLog.h"
#include "AliMCEventHandler.h"

#include "AliMultiInputEventHandler.h"

ClassImp(AliMultiInputEventHandler)

static Option_t *gCurrentMultiDataType = "ESD";

//_____________________________________________________________________________
AliMultiInputEventHandler::AliMultiInputEventHandler(const Int_t size, const char *name) :
   AliInputEventHandler(name, name),
   fBufferSize(size),
   fInputHandlers(),
   fAnalysisType(0)
{
//
// Default constructor.
//
   AliDebug(AliLog::kDebug + 10, "<-");
   fInputHandlers.SetOwner(kTRUE);
   AliDebug(AliLog::kDebug + 10, "->");
}

//_____________________________________________________________________________
AliMultiInputEventHandler::~AliMultiInputEventHandler()
{
   //
   // Destructor
   //
   AliDebug(AliLog::kDebug + 10, "<-");
   AliDebug(AliLog::kDebug + 10, "->");
}


//_____________________________________________________________________________
AliVEventHandler *AliMultiInputEventHandler::InputEventHandler(const Int_t index)
{
   //
   // Returns input handler
   //
   AliDebug(AliLog::kDebug + 5, Form("<-"));
   if ((index >= 0) && (index < fBufferSize)) {
      return (AliVEventHandler *) fInputHandlers.At(index);
   }
   AliDebug(AliLog::kDebug + 5, Form("->"));
   return 0;
}

//_____________________________________________________________________________
void AliMultiInputEventHandler::AddInputEventHandler(AliVEventHandler*inHandler)
{
   //
   // Create N (fBufferSize) copies of input handler
   //
   if (inHandler->InheritsFrom("AliESDInputHandler")) gCurrentMultiDataType = "ESD";
   if (inHandler->InheritsFrom("AliAODInputHandler")) gCurrentMultiDataType = "AOD";
   AliDebug(AliLog::kDebug + 5, Form("<-"));
   AliDebug(AliLog::kDebug + 5, Form("Creating %d input event handlers ...", fBufferSize));
   AliDebug(AliLog::kDebug + 5, Form("Adding input handler with index %d ...", fBufferSize));
   fInputHandlers.Add(inHandler);
   fBufferSize++;
   AliDebug(AliLog::kDebug + 5, Form("->"));
}

//_____________________________________________________________________________
Bool_t AliMultiInputEventHandler::Init(Option_t *opt)
{
   //
   // Init() is called for all mix input handlers.
   //
   fAnalysisType = opt;
   AliDebug(AliLog::kDebug + 5, Form("<- \"%s\"", opt));
   AliInputEventHandler *eh = 0;
   TObjArrayIter next(&fInputHandlers);
   while ((eh = (AliInputEventHandler *) next())) {
      eh->Init(fAnalysisType);
   }
   AliDebug(AliLog::kDebug + 5, Form("->"));
   return AliInputEventHandler::Init(opt);
}
//_____________________________________________________________________________
Bool_t AliMultiInputEventHandler::Init(TTree *tree, Option_t *opt)
{
   //
   // Init(const char*path) is called for all mix input handlers.
   // Create event pool if needed
   //
   fAnalysisType = opt;
   AliDebug(AliLog::kDebug + 5, Form("<- %p %s", (void *) tree, tree->GetName()));
   if (!tree) {
      AliError(Form("-> tree is null"));
      return kFALSE;
   }
   AliInputEventHandler *eh = 0;
   TObjArrayIter next(&fInputHandlers);
   while ((eh = (AliInputEventHandler *) next())) {
      // using mixing input hadnler from Base class
      // for me fParentHandler would be better name
      eh->SetParentHandler(this);
      eh->Init(tree, fAnalysisType);
   }
   AliDebug(AliLog::kDebug + 5, Form("->"));
   return AliInputEventHandler::Init(tree, opt);
}
//_____________________________________________________________________________
Bool_t AliMultiInputEventHandler::Notify()
{
   //
   // Notify() is called for all mix input handlers
   //
   AliDebug(AliLog::kDebug + 5, Form("<-"));
   AliInputEventHandler *eh = 0;
   TObjArrayIter next(&fInputHandlers);
   while ((eh = (AliInputEventHandler *) next())) {
      eh->Notify();
   }
   AliDebug(AliLog::kDebug + 5, Form("->"));
   return AliInputEventHandler::Notify();
}

//_____________________________________________________________________________
Bool_t AliMultiInputEventHandler::Notify(const char *path)
{
   //
   // Notify(const char*path) is called for all mix input handlers
   //
   AliDebug(AliLog::kDebug + 5, Form("<- %s", path));
   AliInputEventHandler *eh = 0;
   TObjArrayIter next(&fInputHandlers);
   while ((eh = (AliInputEventHandler *) next())) {
      eh->Notify(path);
   }
   AliDebug(AliLog::kDebug + 5, Form("->"));
//   return AliInputEventHandler::Notify(path);
   return AliInputEventHandler::Notify(path);
}
//_____________________________________________________________________________
Bool_t AliMultiInputEventHandler::BeginEvent(Long64_t entry)
{
   //
   // BeginEvent(Long64_t entry) is called for all mix input handlers
   //
   AliDebug(AliLog::kDebug + 5, Form("<- %lld", entry));
   AliInputEventHandler *eh = 0;
   TObjArrayIter next(&fInputHandlers);
   while ((eh = (AliInputEventHandler *) next())) {
      eh->BeginEvent(entry);
   }
   GetEntry();
   AliDebug(AliLog::kDebug + 5, Form("->"));
   return AliInputEventHandler::BeginEvent(entry);
}


//_____________________________________________________________________________
Bool_t AliMultiInputEventHandler::GetEntry()
{
   //
   // Sets correct events to every mix events
   //
   AliDebug(AliLog::kDebug + 5, Form("<-"));
   AliInputEventHandler *eh = 0;
   TObjArrayIter next(&fInputHandlers);
   while ((eh = (AliInputEventHandler *) next())) {
      eh->GetEntry();
   }
   AliDebug(AliLog::kDebug + 5, Form("->"));
   return AliInputEventHandler::GetEntry();
}
//_____________________________________________________________________________
Bool_t AliMultiInputEventHandler::FinishEvent()
{
   //
   // FinishEvent() is called for all mix input handlers
   //
   AliDebug(AliLog::kDebug + 5, Form("<-"));
   AliInputEventHandler *eh = 0;
   TObjArrayIter next(&fInputHandlers);
   while ((eh = (AliInputEventHandler *) next())) {
      eh->FinishEvent();
   }
   AliDebug(AliLog::kDebug + 5, Form("->"));
   return AliInputEventHandler::FinishEvent();
}

AliInputEventHandler *AliMultiInputEventHandler::GetFirstInputEventHandler()
{
   //
   // Return first InputEventHandler
   //
   AliDebug(AliLog::kDebug + 5, Form("<-"));
   AliVEventHandler *eh = 0;
   AliInputEventHandler *handler = 0;
   TObjArrayIter next(&fInputHandlers);
   while ((eh = (AliVEventHandler *) next())) {
      handler = dynamic_cast<AliInputEventHandler *>(eh);
      if (handler) return handler;
   }
   AliDebug(AliLog::kDebug + 5, Form("->"));
   return 0;
}
AliMCEventHandler *AliMultiInputEventHandler::GetFirstMCEventHandler()
{
   //
   // Return first MCEventHandler
   //
   AliDebug(AliLog::kDebug + 5, Form("<-"));
   AliVEventHandler *eh = 0;
   AliMCEventHandler *handler = 0;
   TObjArrayIter next(&fInputHandlers);
   while ((eh = (AliVEventHandler *) next())) {
      handler = dynamic_cast<AliMCEventHandler *>(eh);
      if (handler) return handler;
   }
   AliDebug(AliLog::kDebug + 5, Form("->"));
   return 0;
}

AliMultiInputEventHandler *AliMultiInputEventHandler::GetFirstMultiInputHandler()
{
   //
   // Return first MultiInputHandler
   //
   AliDebug(AliLog::kDebug + 5, Form("<-"));
   AliVEventHandler *eh = 0;
   AliMultiInputEventHandler *handler = 0;
   TObjArrayIter next(&fInputHandlers);
   while ((eh = (AliVEventHandler *) next())) {
      handler = dynamic_cast<AliMultiInputEventHandler *>(eh);
      if (handler) return handler;
   }
   AliDebug(AliLog::kDebug + 5, Form("->"));
   return 0;
}

//______________________________________________________________________________
Option_t *AliMultiInputEventHandler::GetDataType() const
{
   // Returns handled data type.
   return gCurrentMultiDataType;
}

//______________________________________________________________________________
UInt_t  AliMultiInputEventHandler::IsEventSelected() 
{
  // returns if event is selected
  
  AliInputEventHandler *firstIH = dynamic_cast<AliInputEventHandler*> (GetFirstInputEventHandler());
  if (firstIH) {
    return firstIH->IsEventSelected();
  }
  
  return fIsSelectedResult;
}

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