9 static map<string, int> locNumWritersByFileMap;
10 return locNumWritersByFileMap;
19 japp->WriteLock(
"DTreeInterface_SizeMap");
21 static map<TTree*, map<string, size_t> > locFundamentalArraySizeMap;
22 map<string, size_t>& locTreeSpecificMap = locFundamentalArraySizeMap[locTree];
24 japp->Unlock(
"DTreeInterface_SizeMap");
25 return locTreeSpecificMap;
32 if(locFileName ==
"hd_root.root")
34 cout <<
"WARNING: SAVING TREES TO hd_root.root IS NOT SUPPORTED (or wise). ";
35 cout <<
"RETURNING NULL FROM DTreeInterface::Create_DTreeInterface()" << endl;
43 dTreeIndex_MajorBranchName(
"0"), dTreeIndex_MinorBranchName(
"0")
45 japp->RootWriteLock();
48 if(locNumWritersByFileMap.find(
dFileName) == locNumWritersByFileMap.end())
61 japp->RootWriteLock();
66 if(locNumWritersByFileMap[
dFileName] != 0)
77 TFile* locOutputFile = (TFile*)gROOT->GetListOfFiles()->FindObject(
dFileName.c_str());
78 locOutputFile->Write(0, TObject::kOverwrite);
79 locOutputFile->Close();
87 japp->RootWriteLock();
89 TDirectory* locCurrentDir = gDirectory;
92 TFile* locOutputFile = (TFile*)gROOT->GetListOfFiles()->FindObject(
dFileName.c_str());
93 if(locOutputFile ==
nullptr)
94 locOutputFile =
new TFile(
dFileName.c_str(),
"RECREATE");
98 dTree = (TTree*)gDirectory->Get(locTreeName.c_str());
101 dTree =
new TTree(locTreeName.c_str(), locTreeName.c_str());
115 bool locBranchesCreatedFlag = (
dTree->GetNbranches() > 0);
117 return locBranchesCreatedFlag;
122 return dTree->GetUserInfo();
136 if(
dTree->GetNbranches() > 0)
143 TList* locInputUserInfo = locTreeBranchRegister.
Get_UserInfo();
144 TList* locTreeUserInfo =
dTree->GetUserInfo();
145 for(Int_t loc_i = 0; loc_i < locInputUserInfo->GetSize(); ++loc_i)
146 locTreeUserInfo->Add(locInputUserInfo->At(loc_i));
151 vector<string> locPostponedBranchNames;
152 for(
const auto& locBranchName : locTreeBranchRegister.
dBranchNames)
155 auto locSizeNameIterator = locTreeBranchRegister.
dArraySizeNameMap.find(locBranchName);
159 if(
dTree->GetBranch(locSizeNameIterator->second.c_str()) ==
nullptr)
161 locPostponedBranchNames.push_back(locBranchName);
167 Create_Branch(locTreeBranchRegister, locBranchName, locFundamentalArraySizeMap);
171 for(
string& locBranchName : locPostponedBranchNames)
172 Create_Branch(locTreeBranchRegister, locBranchName, locFundamentalArraySizeMap);
181 const type_index& locTypeIndex = locTreeBranchRegister.
dBranchTypeMap.find(locBranchName)->second;
191 size_t locArraySize = locSizeIterator->second;
194 auto locSizeNameIterator = locTreeBranchRegister.
dArraySizeNameMap.find(locBranchName);
196 Create_Branch(locBranchName, locTypeIndex, locArraySize,
"");
199 Create_Branch(locBranchName, locTypeIndex, locArraySize, locSizeNameIterator->second);
200 locFundamentalArraySizeMap[locBranchName] = locArraySize;
207 if(locTypeIndex == type_index(
typeid(Char_t)))
208 Create_Branch<Char_t>(locBranchName, locArraySize, locArraySizeName);
209 else if(locTypeIndex == type_index(
typeid(UChar_t)))
210 Create_Branch<UChar_t>(locBranchName, locArraySize, locArraySizeName);
211 else if(locTypeIndex == type_index(
typeid(Short_t)))
212 Create_Branch<Short_t>(locBranchName, locArraySize, locArraySizeName);
213 else if(locTypeIndex == type_index(
typeid(UShort_t)))
214 Create_Branch<UShort_t>(locBranchName, locArraySize, locArraySizeName);
215 else if(locTypeIndex == type_index(
typeid(Int_t)))
216 Create_Branch<Int_t>(locBranchName, locArraySize, locArraySizeName);
217 else if(locTypeIndex == type_index(
typeid(UInt_t)))
218 Create_Branch<UInt_t>(locBranchName, locArraySize, locArraySizeName);
219 else if(locTypeIndex == type_index(
typeid(Float_t)))
220 Create_Branch<Float_t>(locBranchName, locArraySize, locArraySizeName);
221 else if(locTypeIndex == type_index(
typeid(Double_t)))
222 Create_Branch<Double_t>(locBranchName, locArraySize, locArraySizeName);
223 else if(locTypeIndex == type_index(
typeid(Long64_t)))
224 Create_Branch<Long64_t>(locBranchName, locArraySize, locArraySizeName);
225 else if(locTypeIndex == type_index(
typeid(ULong64_t)))
226 Create_Branch<ULong64_t>(locBranchName, locArraySize, locArraySizeName);
227 else if(locTypeIndex == type_index(
typeid(Bool_t)))
228 Create_Branch<Bool_t>(locBranchName, locArraySize, locArraySizeName);
231 else if(locTypeIndex == type_index(
typeid(TVector2)))
232 Create_Branch<TVector2>(locBranchName, locArraySize, locArraySizeName);
233 else if(locTypeIndex == type_index(
typeid(TVector3)))
234 Create_Branch<TVector3>(locBranchName, locArraySize, locArraySizeName);
235 else if(locTypeIndex == type_index(
typeid(TLorentzVector)))
236 Create_Branch<TLorentzVector>(locBranchName, locArraySize, locArraySizeName);
248 for(
auto locBranchPair : locTreeFillData.
dFillData)
251 auto locBranchName = locBranchPair.first;
252 auto locTypeIndex = locBranchPair.second.first;
253 auto locFillBaseClass = locBranchPair.second.second;
255 if(
dTree->GetBranch(locBranchName.c_str()) == NULL)
257 cout <<
"WARNING, CANNOT FILL DATA, BRANCH " << locBranchName <<
" DOES NOT EXIST." << endl;
266 Fill(locBranchName, locTypeIndex, locFillBaseClass->Get(0),
false);
271 auto& locLargestIndexFilled = locLargestIndexFilledIterator->second;
274 auto locFundamentalArraySizeIterator = locFundamentalArraySizeMap.find(locBranchName);
275 if(locFundamentalArraySizeIterator != locFundamentalArraySizeMap.end())
277 size_t locCurrentArraySize = locFundamentalArraySizeMap[locBranchName];
278 if((locLargestIndexFilled + 1) > int(locCurrentArraySize))
281 locFundamentalArraySizeMap[locBranchName] = locLargestIndexFilled + 1;
292 locClonesArray->Clear();
298 for(
int locArrayIndex = 0; locArrayIndex <= locLargestIndexFilled; ++locArrayIndex)
299 Fill(locBranchName, locTypeIndex, locFillBaseClass->Get(locArrayIndex),
true, locArrayIndex);
302 locLargestIndexFilled = -1;
311 for(
auto locBranchPair : locTreeFillData.
dFillData)
312 locBranchPair.second.second->Check_Capacity();
318 if(locTypeIndex == type_index(
typeid(Char_t)))
319 Change_ArraySize<Char_t>(locBranchName, locNewArraySize);
320 else if(locTypeIndex == type_index(
typeid(UChar_t)))
321 Change_ArraySize<UChar_t>(locBranchName, locNewArraySize);
322 else if(locTypeIndex == type_index(
typeid(Short_t)))
323 Change_ArraySize<Short_t>(locBranchName, locNewArraySize);
324 else if(locTypeIndex == type_index(
typeid(UShort_t)))
325 Change_ArraySize<UShort_t>(locBranchName, locNewArraySize);
326 else if(locTypeIndex == type_index(
typeid(Int_t)))
327 Change_ArraySize<Int_t>(locBranchName, locNewArraySize);
328 else if(locTypeIndex == type_index(
typeid(UInt_t)))
329 Change_ArraySize<UInt_t>(locBranchName, locNewArraySize);
330 else if(locTypeIndex == type_index(
typeid(Float_t)))
331 Change_ArraySize<Float_t>(locBranchName, locNewArraySize);
332 else if(locTypeIndex == type_index(
typeid(Double_t)))
333 Change_ArraySize<Double_t>(locBranchName, locNewArraySize);
334 else if(locTypeIndex == type_index(
typeid(Long64_t)))
335 Change_ArraySize<Long64_t>(locBranchName, locNewArraySize);
336 else if(locTypeIndex == type_index(
typeid(ULong64_t)))
337 Change_ArraySize<ULong64_t>(locBranchName, locNewArraySize);
338 else if(locTypeIndex == type_index(
typeid(Bool_t)))
339 Change_ArraySize<Bool_t>(locBranchName, locNewArraySize);
342 void DTreeInterface::Fill(
string locBranchName, type_index locTypeIndex,
void* locVoidPointer,
bool locIsArrayFlag,
size_t locArrayIndex)
345 if(locTypeIndex == type_index(
typeid(Char_t)))
346 Get_Pointer_Fundamental<Char_t>(locBranchName)[locArrayIndex] = *(static_cast<Char_t*>(locVoidPointer));
347 else if(locTypeIndex == type_index(
typeid(UChar_t)))
348 Get_Pointer_Fundamental<UChar_t>(locBranchName)[locArrayIndex] = *(
static_cast<UChar_t*
>(locVoidPointer));
349 else if(locTypeIndex == type_index(
typeid(Short_t)))
350 Get_Pointer_Fundamental<Short_t>(locBranchName)[locArrayIndex] = *(static_cast<Short_t*>(locVoidPointer));
351 else if(locTypeIndex == type_index(
typeid(UShort_t)))
352 Get_Pointer_Fundamental<UShort_t>(locBranchName)[locArrayIndex] = *(static_cast<UShort_t*>(locVoidPointer));
353 else if(locTypeIndex == type_index(
typeid(Int_t)))
354 Get_Pointer_Fundamental<Int_t>(locBranchName)[locArrayIndex] = *(static_cast<Int_t*>(locVoidPointer));
355 else if(locTypeIndex == type_index(
typeid(UInt_t)))
356 Get_Pointer_Fundamental<UInt_t>(locBranchName)[locArrayIndex] = *(static_cast<UInt_t*>(locVoidPointer));
357 else if(locTypeIndex == type_index(
typeid(Float_t)))
358 Get_Pointer_Fundamental<Float_t>(locBranchName)[locArrayIndex] = *(static_cast<Float_t*>(locVoidPointer));
359 else if(locTypeIndex == type_index(
typeid(Double_t)))
360 Get_Pointer_Fundamental<Double_t>(locBranchName)[locArrayIndex] = *(static_cast<Double_t*>(locVoidPointer));
361 else if(locTypeIndex == type_index(
typeid(Long64_t)))
362 Get_Pointer_Fundamental<Long64_t>(locBranchName)[locArrayIndex] = *(static_cast<Long64_t*>(locVoidPointer));
363 else if(locTypeIndex == type_index(
typeid(ULong64_t)))
364 Get_Pointer_Fundamental<ULong64_t>(locBranchName)[locArrayIndex] = *(static_cast<ULong64_t*>(locVoidPointer));
365 else if(locTypeIndex == type_index(
typeid(Bool_t)))
366 Get_Pointer_Fundamental<Bool_t>(locBranchName)[locArrayIndex] = *(static_cast<Bool_t*>(locVoidPointer));
369 else if(locTypeIndex == type_index(
typeid(TVector3)))
371 TVector3& locObject = *(
static_cast<TVector3*
>(locVoidPointer));
372 Fill_TObject<TVector3>(locBranchName, locObject, locIsArrayFlag, locArrayIndex);
374 else if(locTypeIndex == type_index(
typeid(TVector2)))
376 TVector2& locObject = *(
static_cast<TVector2*
>(locVoidPointer));
377 Fill_TObject<TVector2>(locBranchName, locObject, locIsArrayFlag, locArrayIndex);
379 else if(locTypeIndex == type_index(
typeid(TLorentzVector)))
381 TLorentzVector& locObject = *(
static_cast<TLorentzVector*
>(locVoidPointer));
382 Fill_TObject<TLorentzVector>(locBranchName, locObject, locIsArrayFlag, locArrayIndex);
map< string, size_t > & Get_FundamentalArraySizeMap(TTree *locTree) const
map< string, size_t > dInitialArraySizeMap
void Change_ArraySize(string locBranchName, type_index locTypeIndex, size_t locNewArraySize)
void Create_Branch(const DTreeBranchRegister &locTreeBranchRegister, string locBranchName, map< string, size_t > &locFundamentalArraySizeMap)
const TList * Get_UserInfo(void) const
void GetOrCreate_FileAndTree(string locTreeName)
string dTreeIndex_MinorBranchName
bool Create_Branches(const DTreeBranchRegister &locTreeBranchRegister)
map< string, string > dArraySizeNameMap
map< string, pair< type_index, DFillBaseClass * > > dFillData
vector< string > dBranchNames
void Fill(DTreeFillData &locTreeFillData)
static DTreeInterface * Create_DTreeInterface(string locTreeName, string locFileName)
map< string, int > & Get_NumWritersByFileMap(void) const
TList * Get_UserInfo(void) const
bool Get_BranchesCreatedFlag(void) const
map< string, int > dArrayLargestIndexFilledMap
TClonesArray * Get_Pointer_TClonesArray(string locBranchName)
map< string, type_index > dBranchTypeMap
string dTreeIndex_MajorBranchName