FairRoot/PandaRoot
PndPatternDBMerger.cxx
Go to the documentation of this file.
1 /*
2  * PndPatternDBMerger.cxx
3  *
4  * Created on: Nov 15, 2017
5  * Author: vagrant
6  */
7 
8 #include <PndPatternDBMerger.h>
9 #include <iostream>
10 #include <utility>
11 #include "boost/range/adaptor/reversed.hpp"
12 
13 
15 
17  fpatternTree = NULL;
18  foutputDBFile = NULL;
19  foutputTree = NULL;
20 
21  bPattern = NULL;
22  bMergedPattern = NULL;
23 
24  finputFilename = "patternDB.root";
25  finputTreename = "trackPatterns";
26  foutputFilename = "patternDBclean.root";
27  foutputTreename = finputTreename;
28 }
29 
31 }
32 
34  std::cout << "Executing PndPatternDBMerger" << std::endl;
35 
36  bool bInput = InitInputChain();
37  if (bInput) {
38  std::cout << "Input chain successfully initialised" << std::endl;
39  }
40 
42 
43  IdenticalEntries entriesToBeMerged;
44  entriesToBeMerged = FindIdenticalEntries();
45 
46  std::cout << "Merged entries to be created: " << entriesToBeMerged.size() << std::endl;
47  for (auto iter: boost::adaptors::reverse(entriesToBeMerged)) {
48  std::vector<PndPattern> patternsToBeMerged = GetPatternsForMerging(iter);
49  PndPattern mergedPattern = MergePatterns(patternsToBeMerged);
50  FillOutputTree(mergedPattern);
51  }
52 
53  std::cout << "Saving output tree" << std::endl;
54  foutputTree->AutoSave();
55  foutputDBFile->Close();
56 }
57 
59  std::cout << "Initialising input chain with TTree" << finputTreename << std::endl;
60  fpatternTree = new TChain(finputTreename);
61  std::cout << "Adding input file(s) with name" << finputFilename << std::endl;
63 
64  fpatternTree->SetBranchAddress("pattern",&bPattern);
65 
66  if (!fpatternTree) return false;
67  return true;
68 }
70  std::cout << "Initialising output file and tree" << std::endl;
71  foutputDBFile = new TFile(foutputFilename,"RECREATE");
72  foutputTree = new TTree(foutputTreename,"Tree containing merged patterns");
73  foutputTree->Branch("pattern",&bMergedPattern);
74 }
76  std::cout << "Finding identical patterns in input chain" << std::endl;
77 
78 // pattern, entries in file for corresponding pattern
79  typedef std::map<std::set<int>, std::set<int>> PatternEntries;
80  PatternEntries patternEntries;
81  Long64_t nEntries = fpatternTree->GetEntries();
82  std::cout << "Entries to process: " << nEntries << std::endl;
83 
84  for (Long64_t iEntry = 0; iEntry < nEntries; ++iEntry) {
85  if (iEntry % 10000 == 0) {
86  std::cout << "processing entry " << iEntry << " of " << nEntries << std::endl;
87  }
88  fpatternTree->GetEntry(iEntry);
89  std::set<int> tubeIDs = bPattern->GetTubeIDs();
90  patternEntries[tubeIDs].insert(iEntry);
91  }
92 
93  std::cout << "Unique patterns found in input chain: " << patternEntries.size() << std::endl;
94 
95  std::cout << "Creating map with entries to be merged" << std::endl;
96 // number of entries, actual entries in file
97  IdenticalEntries mapEntries;
98  for (auto iter: patternEntries) {
99  std::set<int> &vEntries = iter.second;
100 // set this to 1 to only consider recurring patterns
101  if (vEntries.size() > 0) {
102  mapEntries.insert(std::make_pair(vEntries.size(), vEntries));
103  }
104  }
105 
106  return mapEntries;
107 }
108 std::vector<PndPattern> PndPatternDBMerger::GetPatternsForMerging(std::pair<int, std::set<int>> entryPair) {
109  std::vector<PndPattern> patternsToBeMerged;
110  for (auto const& entry: entryPair.second) {
111  fpatternTree->GetEntry(entry);
112  patternsToBeMerged.push_back(*bPattern);
113  }
114  return patternsToBeMerged;
115 }
116 PndPattern PndPatternDBMerger::MergePatterns(std::vector<PndPattern> &entries) {
117  PndPattern merged;
118  if (entries.size() == 0) return merged;
119  merged.SetTubeIDs(entries.at(0).GetTubeIDs());
120  merged.SetSectorID(entries.at(0).GetSectorID());
121 
122  for (auto const& pattern: entries) {
123  int currentCount = merged.GetCount();
124  int newCount = currentCount + pattern.GetCount();
125  merged.SetPatternCount(newCount);
126  std::vector<TVector3> momenta = pattern.GetMomenta();
127  merged.AddMomenta(momenta);
128  }
129  return merged;
130 }
132  bMergedPattern = &mergedPattern;
133  foutputTree->Fill();
134 }
PndPattern * bMergedPattern
void SetPatternCount(int count)
Definition: PndPattern.h:29
void SetTubeIDs(std::set< int > tubeIDs)
Definition: PndPattern.h:27
std::vector< PndPattern > GetPatternsForMerging(std::pair< int, std::set< int >> entryPair)
void FillOutputTree(PndPattern &mergedPattern)
void SetSectorID(int sectorID)
Definition: PndPattern.h:23
std::set< int > GetTubeIDs() const
Definition: PndPattern.h:32
int GetCount() const
Definition: PndPattern.h:34
std::multimap< int, std::set< int > > IdenticalEntries
PndPattern MergePatterns(std::vector< PndPattern > &entries)
ClassImp(PndAnaContFact)
void AddMomenta(std::vector< TVector3 > momenta)
Definition: PndPattern.cxx:36
IdenticalEntries FindIdenticalEntries()