Port of new Event Mixing implementation
[u/mrichter/AliRoot.git] / ANALYSIS / EventMixing / AliMixInputHandlerInfo.cxx
1 //
2 // Class AliMixInputHandlerInfo
3 //
4 // AliMixInputHandlerInfo is interface with mixed
5 // input handlers
6 //
7 // author:
8 //        Martin Vala (martin.vala@cern.ch)
9 //
10 #include <TTree.h>
11 #include <TChain.h>
12 #include <TFile.h>
13 #include <TChainElement.h>
14
15 #include "AliLog.h"
16 #include "AliInputEventHandler.h"
17
18 #include "AliMixInputHandlerInfo.h"
19
20 ClassImp(AliMixInputHandlerInfo)
21
22 //_____________________________________________________________________________
23 AliMixInputHandlerInfo::AliMixInputHandlerInfo(const char *name, const char *title): TNamed(name, title),
24    fChain(0),
25    fChainEntriesArray(),
26    fZeroEntryNumber(0),
27    fNeedNotify(kFALSE)
28 {
29    //
30    // Default constructor.
31    //
32 }
33 //_____________________________________________________________________________
34 AliMixInputHandlerInfo::~AliMixInputHandlerInfo()
35 {
36    //
37    // Destructor
38    //
39    if (fChain) delete fChain;
40 }
41
42 //_____________________________________________________________________________
43 TChain *AliMixInputHandlerInfo::GetChain()
44 {
45    //
46    // Returns curren chain. When chain is null it will create it
47    //
48    if (!fChain) fChain = new TChain(GetName());
49    return fChain;
50 }
51
52 //_____________________________________________________________________________
53 void AliMixInputHandlerInfo::AddChain(TChain *chain)
54 {
55    //
56    // Add chain
57    //
58    AliDebug(AliLog::kDebug + 5, "<-");
59    if (!chain) return;
60    if (fChain) delete fChain;
61    fChain = new TChain(GetName());
62    fChain->Add(chain);
63    AliDebug(AliLog::kDebug + 5, "->");
64 }
65
66 //_____________________________________________________________________________
67 void AliMixInputHandlerInfo::AddTreeToChain(const char *path)
68 {
69    //
70    // Adds tree in to chain
71    //
72    AliDebug(AliLog::kDebug + 5, Form("<- %s", path));
73    GetChain();
74    fChain->AddFile(path);
75    AliDebug(AliLog::kDebug + 3, Form("Num files in fChain %d", fChain->GetListOfFiles()->GetEntries()));
76    Long64_t sumTree = fZeroEntryNumber;
77    for (Int_t i = 0; i < fChainEntriesArray.GetSize() ; i++) sumTree += fChainEntriesArray.At(i);
78    fChain->LoadTree(sumTree);
79    Int_t lastIndex = fChain->GetListOfFiles()->GetEntries();
80    AliDebug(AliLog::kDebug + 3, Form("Num files in fChain %d", lastIndex));
81    fChainEntriesArray.Set(lastIndex);
82    AliDebug(AliLog::kDebug + 3, Form("Adding %lld to id %d", fChain->GetTree()->GetEntries(), lastIndex - 1));
83    fChainEntriesArray.AddAt((Int_t)fChain->GetTree()->GetEntries(), (Int_t)lastIndex - 1);
84    AliDebug(AliLog::kDebug + 5, Form("-> %s", path));
85 }
86
87 //_____________________________________________________________________________
88 TChainElement *AliMixInputHandlerInfo::GetEntryInTree(Long64_t &entry)
89 {
90    //
91    // Get entry in current tree
92    //
93    AliDebug(AliLog::kDebug + 5, Form("<- %lld", entry));
94    fZeroEntryNumber = 0;
95    if (entry < fZeroEntryNumber) {
96       AliError(Form("Num %lld is less then ZeroEntryNumber(%lld)", entry, fZeroEntryNumber));
97       entry = -1;
98       AliDebug(AliLog::kDebug + 5, "->");
99       return 0;
100    }
101    Long64_t sumTree = fZeroEntryNumber;
102    for (Int_t i = 0; i < fChainEntriesArray.GetSize() ; i++) {
103       sumTree += fChainEntriesArray.At(i);
104       if (sumTree > entry) {
105          sumTree = entry - sumTree + fChainEntriesArray.At(i);
106          AliDebug(AliLog::kDebug + 1, Form("Entry in current tree num is %lld with i=%d", sumTree, i));
107          entry = sumTree;
108          AliDebug(AliLog::kDebug + 5, "->");
109          return (TChainElement *) fChain->GetListOfFiles()->At(i);
110       }
111    }
112    entry = -1;
113    AliDebug(AliLog::kDebug + 5, "->");
114    return 0;
115 }
116
117 //_____________________________________________________________________________
118 void AliMixInputHandlerInfo::PrepareEntry(TChainElement *te, Long64_t entry, AliInputEventHandler *eh, Option_t *opt)
119 {
120    //
121    // Prepare Entry
122    //
123    AliDebug(AliLog::kDebug + 5, Form("<- %lld", entry));
124    if (!te) {
125       AliDebug(AliLog::kDebug + 5, "-> te is null");
126       return;
127    }
128    if (entry < 0) {
129       AliDebug(AliLog::kDebug, Form("We are creating new chain from file %s ...", te->GetTitle()));
130       if (!fChain) {
131          fChain = new TChain(te->GetName());
132          fChain->AddFile(te->GetTitle());
133          fChain->GetEntry(0);
134          eh->Init(fChain->GetTree(), opt);
135 //       eh->Notify(te->GetTitle());
136       }
137       fNeedNotify = kTRUE;
138       AliDebug(AliLog::kDebug + 5, "->");
139       return;
140    }
141    if (fChain) {
142       AliDebug(AliLog::kDebug, Form("Filename is %s", fChain->GetTree()->GetCurrentFile()->GetName()));
143       TString fn = fChain->GetTree()->GetCurrentFile()->GetName();
144       if (fn.CompareTo(te->GetTitle())) {
145          AliDebug(AliLog::kDebug, Form("Filename %s is NOT same ...", te->GetTitle()));
146          AliDebug(AliLog::kDebug, Form("We are changing to file %s ...", te->GetTitle()));
147          // change file
148          delete fChain;
149          fChain = new TChain(te->GetName());
150          fChain->AddFile(te->GetTitle());
151          fChain->GetEntry(0);
152          eh->Init(fChain->GetTree(), opt);
153          eh->Notify(te->GetTitle());
154          eh->BeginEvent(entry);
155          fChain->GetEntry(entry);
156          fNeedNotify = kFALSE;
157       } else {
158          AliDebug(AliLog::kDebug, Form("We are reusing file %s ...", te->GetTitle()));
159          if (fNeedNotify) eh->Notify(te->GetTitle());
160          fNeedNotify = kFALSE;
161          AliDebug(AliLog::kDebug, Form("Entry is %lld  fChain->GetEntries %lld ...", entry, fChain->GetEntries()));
162          eh->BeginEvent(entry);
163          fChain->GetEntry(entry);
164          // file is in tree fChain already
165       }
166    }
167    AliDebug(AliLog::kDebug, Form("We are USING file %s ...", te->GetTitle()));
168    AliDebug(AliLog::kDebug, Form("We are USING file from fChain->GetTree() %s ...", fChain->GetTree()->GetCurrentFile()->GetName()));
169    // here we have correct chain with 1 tree only
170    AliDebug(AliLog::kDebug + 5, "->");
171 }
172
173 //_____________________________________________________________________________
174 Long64_t AliMixInputHandlerInfo::GetEntries()
175 {
176    //
177    // Returns number of entries
178    //
179    if (fChain) return fChain->GetEntries();
180    return -1;
181 }