1 |
#include "varkeepter.h"
|
2 |
|
3 |
varkeepter::varkeepter(TString varfile, TString modepar, TString treefile, int dummy, TString treename, TTree *intree):
|
4 |
mode_(modepar),
|
5 |
infile_(0),
|
6 |
intreename_(treename),
|
7 |
intree_(0),
|
8 |
outfile_(0),
|
9 |
outtreename_(treename),
|
10 |
outtree_(0)
|
11 |
{
|
12 |
dummy += 7; // horrible hack to make the constructor overloading not be ambiguous...
|
13 |
readtext(varfile);
|
14 |
init(mode_, treefile, intree);
|
15 |
}
|
16 |
//----------------------------------------------------------------------------------------
|
17 |
varkeepter::varkeepter(TString varfile, TString modepar, TString infilename, TString outfilename, TString treename):
|
18 |
mode_(modepar),
|
19 |
infile_(0),
|
20 |
intreename_(treename),
|
21 |
intree_(0),
|
22 |
outfile_(0),
|
23 |
outtreename_(treename),
|
24 |
outtree_(0)
|
25 |
{
|
26 |
// use this form to read a tree and copy it to a new file (with modifications/cuts)
|
27 |
assert(modepar=="rw");
|
28 |
readtext(varfile);
|
29 |
init("r",infilename);
|
30 |
init("w",outfilename);
|
31 |
}
|
32 |
//----------------------------------------------------------------------------------------
|
33 |
void varkeepter::readtext(TString varfile)
|
34 |
{
|
35 |
// read in list of variables and types from text file
|
36 |
ifstream ifs(varfile);
|
37 |
assert(ifs.is_open());
|
38 |
string line;
|
39 |
while(getline(ifs,line)) {
|
40 |
if(line[0]=='#') continue;
|
41 |
stringstream ss(line);
|
42 |
TString name,type;
|
43 |
ss >> type >> name;
|
44 |
namev_.push_back(name);
|
45 |
typev_.push_back(type);
|
46 |
if(type=="F") float_map_[name] = 0;
|
47 |
else if(type=="D") double_map_[name] = 0;
|
48 |
else if(type=="i") uint_map_[name] = 0;
|
49 |
else if(type=="I") int_map_[name] = 0;
|
50 |
else assert(0);
|
51 |
}
|
52 |
}
|
53 |
//----------------------------------------------------------------------------------------
|
54 |
void varkeepter::init(TString initmode, TString treefile, TTree *intree)
|
55 |
{
|
56 |
if(initmode=="r") {
|
57 |
if(intree) {
|
58 |
infname_ = "";
|
59 |
infile_ = 0;
|
60 |
intree_ = intree;
|
61 |
} else {
|
62 |
infname_ = treefile;
|
63 |
infile_ = TFile::Open(infname_); assert(infile_);
|
64 |
infile_->GetObject(intreename_,intree_); assert(intree_);
|
65 |
}
|
66 |
} else if(initmode=="w") {
|
67 |
outfname_ = treefile;
|
68 |
outfile_ = TFile::Open(outfname_,"recreate"); assert(outfile_);
|
69 |
outtree_ = new TTree(outtreename_,outtreename_); assert(outtree_);
|
70 |
outtree_->SetAutoFlush(0);//????????????????????????????????????????????????????????????????????????????????????????
|
71 |
} else assert(0);
|
72 |
|
73 |
// set addresses or make branches for unsigned ints
|
74 |
map<TString,UInt_t>::iterator it_uint;
|
75 |
for(it_uint=uint_map_.begin(); it_uint!=uint_map_.end(); it_uint++) {
|
76 |
if(initmode=="r")
|
77 |
intree_->SetBranchAddress((*it_uint).first,&(*it_uint).second);
|
78 |
else if(initmode=="w")
|
79 |
outtree_->Branch((*it_uint).first,&(*it_uint).second,(*it_uint).first+"/i");
|
80 |
else assert(0);
|
81 |
}
|
82 |
// set addresses or make branches for ints
|
83 |
map<TString,Int_t>::iterator it_int;
|
84 |
for(it_int=int_map_.begin(); it_int!=int_map_.end(); it_int++) {
|
85 |
if(initmode=="r")
|
86 |
intree_->SetBranchAddress((*it_int).first,&(*it_int).second);
|
87 |
else if(initmode=="w")
|
88 |
outtree_->Branch((*it_int).first,&(*it_int).second,(*it_int).first+"/I");
|
89 |
else assert(0);
|
90 |
}
|
91 |
// set addresses or make branches for floats
|
92 |
map<TString,Float_t>::iterator it_float;
|
93 |
for(it_float=float_map_.begin(); it_float!=float_map_.end(); it_float++) {
|
94 |
if(initmode=="r") {
|
95 |
TString branchname((*it_float).first);
|
96 |
intree_->SetBranchAddress(branchname,&(*it_float).second);
|
97 |
} else if(initmode=="w")
|
98 |
outtree_->Branch((*it_float).first,&(*it_float).second,(*it_float).first+"/F");
|
99 |
else assert(0);
|
100 |
}
|
101 |
// set addresses or make branches for doubles
|
102 |
map<TString,Double_t>::iterator it_double;
|
103 |
for(it_double=double_map_.begin(); it_double!=double_map_.end(); it_double++) {
|
104 |
if(initmode=="r") {
|
105 |
TString branchname((*it_double).first);
|
106 |
intree_->SetBranchAddress(branchname,&(*it_double).second);
|
107 |
} else if(initmode=="w")
|
108 |
outtree_->Branch((*it_double).first,&(*it_double).second,(*it_double).first+"/D");
|
109 |
else assert(0);
|
110 |
}
|
111 |
}
|
112 |
//----------------------------------------------------------------------------------------
|
113 |
TTree *varkeepter::gettree(TString inout)
|
114 |
{
|
115 |
// ignores inout if mode_ is r or w
|
116 |
if(mode_=="r" || (mode_=="rw" && inout=="in")) { assert(intree_); return intree_; }
|
117 |
else if(mode_=="w" || (mode_=="rw" && inout=="out")) { assert(outtree_); return outtree_; }
|
118 |
else assert(0);
|
119 |
}
|
120 |
//----------------------------------------------------------------------------------------
|
121 |
void varkeepter::getentry(UInt_t ientry)
|
122 |
{
|
123 |
gettree("in")->GetEntry(ientry);
|
124 |
}
|
125 |
//----------------------------------------------------------------------------------------
|
126 |
Long64_t varkeepter::getentries()
|
127 |
{
|
128 |
return gettree("in")->GetEntries();
|
129 |
}
|
130 |
//----------------------------------------------------------------------------------------
|
131 |
Float_t varkeepter::getval(TString name)
|
132 |
{
|
133 |
if(float_map_.find(name) != float_map_.end()) return float_map_[name];
|
134 |
if(double_map_.find(name) != double_map_.end()) return double_map_[name];
|
135 |
if( int_map_.find(name) != int_map_.end()) return int_map_[name];
|
136 |
if( uint_map_.find(name) != uint_map_.end()) return uint_map_[name];
|
137 |
cout << "ERROR: var " << name << " not found." << endl;
|
138 |
assert(0);
|
139 |
}
|
140 |
//----------------------------------------------------------------------------------------
|
141 |
Float_t varkeepter::getfloatval(TString name)
|
142 |
{
|
143 |
if(float_map_.find(name) == float_map_.end()) {
|
144 |
cerr << "varkeepter: " << name << " not found!" << endl;
|
145 |
assert(0);
|
146 |
}
|
147 |
return float_map_[name];
|
148 |
}
|
149 |
//----------------------------------------------------------------------------------------
|
150 |
UInt_t varkeepter::getuintval(TString name)
|
151 |
{
|
152 |
if(uint_map_.find(name) == uint_map_.end()) {
|
153 |
cerr << "varkeepter: " << name << " not found!" << endl;
|
154 |
assert(0);
|
155 |
}
|
156 |
return uint_map_[name];
|
157 |
}
|
158 |
//----------------------------------------------------------------------------------------
|
159 |
Int_t varkeepter::getintval(TString name)
|
160 |
{
|
161 |
if(int_map_.find(name) == int_map_.end()) {
|
162 |
cerr << "varkeepter: " << name << " not found!" << endl;
|
163 |
assert(0);
|
164 |
}
|
165 |
return int_map_[name];
|
166 |
}
|
167 |
//----------------------------------------------------------------------------------------
|
168 |
void varkeepter::setval(TString name, Float_t val)
|
169 |
{
|
170 |
if(float_map_.find(name) == float_map_.end()) {
|
171 |
cerr << "varkeepter: " << name << " not found!" << endl;
|
172 |
assert(0);
|
173 |
}
|
174 |
float_map_[name] = val;
|
175 |
}
|
176 |
//----------------------------------------------------------------------------------------
|
177 |
void varkeepter::setval(TString name, Double_t val)
|
178 |
{
|
179 |
if(double_map_.find(name) == double_map_.end()) {
|
180 |
cerr << "varkeepter: " << name << " not found!" << endl;
|
181 |
assert(0);
|
182 |
}
|
183 |
double_map_[name] = val;
|
184 |
}
|
185 |
//----------------------------------------------------------------------------------------
|
186 |
void varkeepter::setval(TString name, UInt_t val)
|
187 |
{
|
188 |
if(uint_map_.find(name) == uint_map_.end()) {
|
189 |
cerr << "varkeepter: " << name << " not found!" << endl;
|
190 |
assert(0);
|
191 |
}
|
192 |
uint_map_[name] = val;
|
193 |
}
|
194 |
//----------------------------------------------------------------------------------------
|
195 |
void varkeepter::setval(TString name, Int_t val)
|
196 |
{
|
197 |
if(int_map_.find(name) == int_map_.end()) {
|
198 |
cerr << "varkeepter: " << name << " not found!" << endl;
|
199 |
assert(0);
|
200 |
}
|
201 |
int_map_[name] = val;
|
202 |
}
|
203 |
//----------------------------------------------------------------------------------------
|
204 |
void varkeepter::fill()
|
205 |
{
|
206 |
assert(mode_!="r");
|
207 |
gettree("out")->Fill();
|
208 |
}
|
209 |
//----------------------------------------------------------------------------------------
|
210 |
void varkeepter::writeclose()
|
211 |
{
|
212 |
assert(mode_!="r");
|
213 |
outfile_->cd();
|
214 |
outfile_->Write();
|
215 |
outfile_->Close();
|
216 |
}
|
217 |
|