ROOT logo
//
// Class AliMixInputHandlerInfo
//
// AliMixInputHandlerInfo is interface with mixed
// input handlers
//
// author:
//        Martin Vala (martin.vala@cern.ch)
//
#include <TTree.h>
#include <TChain.h>
#include <TFile.h>
#include <TChainElement.h>

#include "AliLog.h"
#include "AliInputEventHandler.h"

#include "AliMixInputHandlerInfo.h"

ClassImp(AliMixInputHandlerInfo)

//_____________________________________________________________________________
AliMixInputHandlerInfo::AliMixInputHandlerInfo(const char *name, const char *title): TNamed(name, title),
   fChain(0),
   fChainEntriesArray(),
   fZeroEntryNumber(0),
   fNeedNotify(kFALSE)
{
   //
   // Default constructor.
   //
}
//_____________________________________________________________________________
AliMixInputHandlerInfo::~AliMixInputHandlerInfo()
{
   //
   // Destructor
   //
   if (fChain) delete fChain;
}

//_____________________________________________________________________________
TChain *AliMixInputHandlerInfo::GetChain()
{
   //
   // Returns curren chain. When chain is null it will create it
   //
   if (!fChain) fChain = new TChain(GetName());
   return fChain;
}

//_____________________________________________________________________________
void AliMixInputHandlerInfo::AddChain(TChain *chain)
{
   //
   // Add chain
   //
   AliDebug(AliLog::kDebug + 5, "<-");
   if (!chain) return;
   if (fChain) delete fChain;
   fChain = new TChain(GetName());
   fChain->Add(chain);
   AliDebug(AliLog::kDebug + 5, "->");
}

//_____________________________________________________________________________
void AliMixInputHandlerInfo::AddTreeToChain(const char *path)
{
   //
   // Adds tree in to chain
   //
   AliDebug(AliLog::kDebug + 5, Form("<- %s", path));
   GetChain();
   fChain->AddFile(path);
   AliDebug(AliLog::kDebug + 3, Form("Num files in fChain %d", fChain->GetListOfFiles()->GetEntries()));
   Long64_t sumTree = fZeroEntryNumber;
   for (Int_t i = 0; i < fChainEntriesArray.GetSize() ; i++) sumTree += fChainEntriesArray.At(i);
   fChain->LoadTree(sumTree);
   Int_t lastIndex = fChain->GetListOfFiles()->GetEntries();
   AliDebug(AliLog::kDebug + 3, Form("Num files in fChain %d", lastIndex));
   fChainEntriesArray.Set(lastIndex);
   AliDebug(AliLog::kDebug + 3, Form("Adding %lld to id %d", fChain->GetTree()->GetEntries(), lastIndex - 1));
   fChainEntriesArray.AddAt((Int_t)fChain->GetTree()->GetEntries(), (Int_t)lastIndex - 1);
   AliDebug(AliLog::kDebug + 5, Form("-> %s", path));
}

//_____________________________________________________________________________
TChainElement *AliMixInputHandlerInfo::GetEntryInTree(Long64_t &entry)
{
   //
   // Get entry in current tree
   //
   AliDebug(AliLog::kDebug + 5, Form("<- %lld", entry));
   fZeroEntryNumber = 0;
   if (entry < fZeroEntryNumber) {
      AliError(Form("Num %lld is less then ZeroEntryNumber(%lld)", entry, fZeroEntryNumber));
      entry = -1;
      AliDebug(AliLog::kDebug + 5, "->");
      return 0;
   }
   Long64_t sumTree = fZeroEntryNumber;
   for (Int_t i = 0; i < fChainEntriesArray.GetSize() ; i++) {
      sumTree += fChainEntriesArray.At(i);
      if (sumTree > entry) {
         sumTree = entry - sumTree + fChainEntriesArray.At(i);
         AliDebug(AliLog::kDebug + 1, Form("Entry in current tree num is %lld with i=%d", sumTree, i));
         entry = sumTree;
         AliDebug(AliLog::kDebug + 5, "->");
         return (TChainElement *) fChain->GetListOfFiles()->At(i);
      }
   }
   entry = -1;
   AliDebug(AliLog::kDebug + 5, "->");
   return 0;
}

//_____________________________________________________________________________
void AliMixInputHandlerInfo::PrepareEntry(TChainElement *te, Long64_t entry, AliInputEventHandler *eh, Option_t *opt)
{
   //
   // Prepare Entry
   //
   AliDebug(AliLog::kDebug + 5, Form("<- %lld", entry));
   if (!te) {
      AliDebug(AliLog::kDebug + 5, "-> te is null");
      return;
   }
   if (entry < 0) {
      AliDebug(AliLog::kDebug, Form("We are creating new chain from file %s ...", te->GetTitle()));
      if (!fChain) {
         fChain = new TChain(te->GetName());
         fChain->AddFile(te->GetTitle());
         fChain->GetEntry(0);
         eh->Init(opt);
         eh->Init(fChain->GetTree(), opt);
      }
      fNeedNotify = kTRUE;
      AliDebug(AliLog::kDebug + 5, "->");
      return;
   }
   if (fChain) {
      AliDebug(AliLog::kDebug, Form("Filename is %s", fChain->GetTree()->GetCurrentFile()->GetName()));
      TString fn = fChain->GetTree()->GetCurrentFile()->GetName();
      if (fn.CompareTo(te->GetTitle())) {
         AliDebug(AliLog::kDebug, Form("Filename %s is NOT same ...", te->GetTitle()));
         AliDebug(AliLog::kDebug, Form("We are changing to file %s ...", te->GetTitle()));
         // change file
         delete fChain;
         fChain = new TChain(te->GetName());
         fChain->AddFile(te->GetTitle());
         fChain->GetEntry(0);
         eh->Init(opt);
         eh->Init(fChain->GetTree(), opt);
         eh->Notify(te->GetTitle());
         fChain->GetEntry(entry);
         eh->BeginEvent(entry);
         fNeedNotify = kFALSE;
      } else {
         AliDebug(AliLog::kDebug, Form("We are reusing file %s ...", te->GetTitle()));
         if (fNeedNotify) eh->Notify(te->GetTitle());
         fNeedNotify = kFALSE;
         AliDebug(AliLog::kDebug, Form("Entry is %lld  fChain->GetEntries %lld ...", entry, fChain->GetEntries()));
         fChain->GetEntry(entry);
         eh->BeginEvent(entry);
         // file is in tree fChain already
      }
   }
   AliDebug(AliLog::kDebug, Form("We are USING file %s ...", te->GetTitle()));
   AliDebug(AliLog::kDebug, Form("We are USING file from fChain->GetTree() %s ...", fChain->GetTree()->GetCurrentFile()->GetName()));
   // here we have correct chain with 1 tree only
   AliDebug(AliLog::kDebug + 5, "->");
}

//_____________________________________________________________________________
Long64_t AliMixInputHandlerInfo::GetEntries()
{
   //
   // Returns number of entries
   //
   if (fChain) return fChain->GetEntries();
   return -1;
}
 AliMixInputHandlerInfo.cxx:1
 AliMixInputHandlerInfo.cxx:2
 AliMixInputHandlerInfo.cxx:3
 AliMixInputHandlerInfo.cxx:4
 AliMixInputHandlerInfo.cxx:5
 AliMixInputHandlerInfo.cxx:6
 AliMixInputHandlerInfo.cxx:7
 AliMixInputHandlerInfo.cxx:8
 AliMixInputHandlerInfo.cxx:9
 AliMixInputHandlerInfo.cxx:10
 AliMixInputHandlerInfo.cxx:11
 AliMixInputHandlerInfo.cxx:12
 AliMixInputHandlerInfo.cxx:13
 AliMixInputHandlerInfo.cxx:14
 AliMixInputHandlerInfo.cxx:15
 AliMixInputHandlerInfo.cxx:16
 AliMixInputHandlerInfo.cxx:17
 AliMixInputHandlerInfo.cxx:18
 AliMixInputHandlerInfo.cxx:19
 AliMixInputHandlerInfo.cxx:20
 AliMixInputHandlerInfo.cxx:21
 AliMixInputHandlerInfo.cxx:22
 AliMixInputHandlerInfo.cxx:23
 AliMixInputHandlerInfo.cxx:24
 AliMixInputHandlerInfo.cxx:25
 AliMixInputHandlerInfo.cxx:26
 AliMixInputHandlerInfo.cxx:27
 AliMixInputHandlerInfo.cxx:28
 AliMixInputHandlerInfo.cxx:29
 AliMixInputHandlerInfo.cxx:30
 AliMixInputHandlerInfo.cxx:31
 AliMixInputHandlerInfo.cxx:32
 AliMixInputHandlerInfo.cxx:33
 AliMixInputHandlerInfo.cxx:34
 AliMixInputHandlerInfo.cxx:35
 AliMixInputHandlerInfo.cxx:36
 AliMixInputHandlerInfo.cxx:37
 AliMixInputHandlerInfo.cxx:38
 AliMixInputHandlerInfo.cxx:39
 AliMixInputHandlerInfo.cxx:40
 AliMixInputHandlerInfo.cxx:41
 AliMixInputHandlerInfo.cxx:42
 AliMixInputHandlerInfo.cxx:43
 AliMixInputHandlerInfo.cxx:44
 AliMixInputHandlerInfo.cxx:45
 AliMixInputHandlerInfo.cxx:46
 AliMixInputHandlerInfo.cxx:47
 AliMixInputHandlerInfo.cxx:48
 AliMixInputHandlerInfo.cxx:49
 AliMixInputHandlerInfo.cxx:50
 AliMixInputHandlerInfo.cxx:51
 AliMixInputHandlerInfo.cxx:52
 AliMixInputHandlerInfo.cxx:53
 AliMixInputHandlerInfo.cxx:54
 AliMixInputHandlerInfo.cxx:55
 AliMixInputHandlerInfo.cxx:56
 AliMixInputHandlerInfo.cxx:57
 AliMixInputHandlerInfo.cxx:58
 AliMixInputHandlerInfo.cxx:59
 AliMixInputHandlerInfo.cxx:60
 AliMixInputHandlerInfo.cxx:61
 AliMixInputHandlerInfo.cxx:62
 AliMixInputHandlerInfo.cxx:63
 AliMixInputHandlerInfo.cxx:64
 AliMixInputHandlerInfo.cxx:65
 AliMixInputHandlerInfo.cxx:66
 AliMixInputHandlerInfo.cxx:67
 AliMixInputHandlerInfo.cxx:68
 AliMixInputHandlerInfo.cxx:69
 AliMixInputHandlerInfo.cxx:70
 AliMixInputHandlerInfo.cxx:71
 AliMixInputHandlerInfo.cxx:72
 AliMixInputHandlerInfo.cxx:73
 AliMixInputHandlerInfo.cxx:74
 AliMixInputHandlerInfo.cxx:75
 AliMixInputHandlerInfo.cxx:76
 AliMixInputHandlerInfo.cxx:77
 AliMixInputHandlerInfo.cxx:78
 AliMixInputHandlerInfo.cxx:79
 AliMixInputHandlerInfo.cxx:80
 AliMixInputHandlerInfo.cxx:81
 AliMixInputHandlerInfo.cxx:82
 AliMixInputHandlerInfo.cxx:83
 AliMixInputHandlerInfo.cxx:84
 AliMixInputHandlerInfo.cxx:85
 AliMixInputHandlerInfo.cxx:86
 AliMixInputHandlerInfo.cxx:87
 AliMixInputHandlerInfo.cxx:88
 AliMixInputHandlerInfo.cxx:89
 AliMixInputHandlerInfo.cxx:90
 AliMixInputHandlerInfo.cxx:91
 AliMixInputHandlerInfo.cxx:92
 AliMixInputHandlerInfo.cxx:93
 AliMixInputHandlerInfo.cxx:94
 AliMixInputHandlerInfo.cxx:95
 AliMixInputHandlerInfo.cxx:96
 AliMixInputHandlerInfo.cxx:97
 AliMixInputHandlerInfo.cxx:98
 AliMixInputHandlerInfo.cxx:99
 AliMixInputHandlerInfo.cxx:100
 AliMixInputHandlerInfo.cxx:101
 AliMixInputHandlerInfo.cxx:102
 AliMixInputHandlerInfo.cxx:103
 AliMixInputHandlerInfo.cxx:104
 AliMixInputHandlerInfo.cxx:105
 AliMixInputHandlerInfo.cxx:106
 AliMixInputHandlerInfo.cxx:107
 AliMixInputHandlerInfo.cxx:108
 AliMixInputHandlerInfo.cxx:109
 AliMixInputHandlerInfo.cxx:110
 AliMixInputHandlerInfo.cxx:111
 AliMixInputHandlerInfo.cxx:112
 AliMixInputHandlerInfo.cxx:113
 AliMixInputHandlerInfo.cxx:114
 AliMixInputHandlerInfo.cxx:115
 AliMixInputHandlerInfo.cxx:116
 AliMixInputHandlerInfo.cxx:117
 AliMixInputHandlerInfo.cxx:118
 AliMixInputHandlerInfo.cxx:119
 AliMixInputHandlerInfo.cxx:120
 AliMixInputHandlerInfo.cxx:121
 AliMixInputHandlerInfo.cxx:122
 AliMixInputHandlerInfo.cxx:123
 AliMixInputHandlerInfo.cxx:124
 AliMixInputHandlerInfo.cxx:125
 AliMixInputHandlerInfo.cxx:126
 AliMixInputHandlerInfo.cxx:127
 AliMixInputHandlerInfo.cxx:128
 AliMixInputHandlerInfo.cxx:129
 AliMixInputHandlerInfo.cxx:130
 AliMixInputHandlerInfo.cxx:131
 AliMixInputHandlerInfo.cxx:132
 AliMixInputHandlerInfo.cxx:133
 AliMixInputHandlerInfo.cxx:134
 AliMixInputHandlerInfo.cxx:135
 AliMixInputHandlerInfo.cxx:136
 AliMixInputHandlerInfo.cxx:137
 AliMixInputHandlerInfo.cxx:138
 AliMixInputHandlerInfo.cxx:139
 AliMixInputHandlerInfo.cxx:140
 AliMixInputHandlerInfo.cxx:141
 AliMixInputHandlerInfo.cxx:142
 AliMixInputHandlerInfo.cxx:143
 AliMixInputHandlerInfo.cxx:144
 AliMixInputHandlerInfo.cxx:145
 AliMixInputHandlerInfo.cxx:146
 AliMixInputHandlerInfo.cxx:147
 AliMixInputHandlerInfo.cxx:148
 AliMixInputHandlerInfo.cxx:149
 AliMixInputHandlerInfo.cxx:150
 AliMixInputHandlerInfo.cxx:151
 AliMixInputHandlerInfo.cxx:152
 AliMixInputHandlerInfo.cxx:153
 AliMixInputHandlerInfo.cxx:154
 AliMixInputHandlerInfo.cxx:155
 AliMixInputHandlerInfo.cxx:156
 AliMixInputHandlerInfo.cxx:157
 AliMixInputHandlerInfo.cxx:158
 AliMixInputHandlerInfo.cxx:159
 AliMixInputHandlerInfo.cxx:160
 AliMixInputHandlerInfo.cxx:161
 AliMixInputHandlerInfo.cxx:162
 AliMixInputHandlerInfo.cxx:163
 AliMixInputHandlerInfo.cxx:164
 AliMixInputHandlerInfo.cxx:165
 AliMixInputHandlerInfo.cxx:166
 AliMixInputHandlerInfo.cxx:167
 AliMixInputHandlerInfo.cxx:168
 AliMixInputHandlerInfo.cxx:169
 AliMixInputHandlerInfo.cxx:170
 AliMixInputHandlerInfo.cxx:171
 AliMixInputHandlerInfo.cxx:172
 AliMixInputHandlerInfo.cxx:173
 AliMixInputHandlerInfo.cxx:174
 AliMixInputHandlerInfo.cxx:175
 AliMixInputHandlerInfo.cxx:176
 AliMixInputHandlerInfo.cxx:177
 AliMixInputHandlerInfo.cxx:178
 AliMixInputHandlerInfo.cxx:179
 AliMixInputHandlerInfo.cxx:180
 AliMixInputHandlerInfo.cxx:181
 AliMixInputHandlerInfo.cxx:182