Simple example to demostrate use of GENIE ReWeight I/O infrastructure. It is a 2-step procedure. First, it processes ALL events in the input file, but performs re-weighting only where it is applicable. An "empty" RW IO record will still be generated and written out for those events where re-weighting does not apply. Second, it opens the GENIE file again, this time in the "READ" mode, and extracts and prints the RW information. WARNING-1: this example is NOT entirely "fool proof" !!! WARNING-2: this example can be quite verbose, due to all the printouts at step-2 !!!
66{
67
68
69
70 std::string isample = "";
71
74 {
76 }
77
78 if ( isample.empty() )
79 {
80
81 std::cout << " Missing GENIE event file on input " << std::endl;
82 return 1;
83 }
84
85
86
87
88
89
90 genie::rew::GSyst_t param_to_tweak = genie::rew::kXSecTwkDial_MaCCQE ;
91
92
93
94 genie::rew::GReWeight rw;
95
96
97
98
99 rw.AdoptWghtCalc( "xsec_ccqe", new genie::rew::GReWeightNuXSecCCQE() );
100
101
102
103
104 genie::rew::GSystSet& syst = rw.Systematics();
105
106 syst.Init( param_to_tweak );
107
108
109
110
111
112 genie::rew::GReWeightNuXSecCCQE* rwccqe = dynamic_cast<genie::rew::GReWeightNuXSecCCQE*>( rw.WghtCalc("xsec_ccqe") );
113 rwccqe->SetMode( genie::rew::GReWeightNuXSecCCQE::kModeMa );
114
115
116
117 TFile* file = new TFile( isample.c_str(), "UPDATE" );
118
119
120
121 if ( !file )
122 {
123 std::cout << " Can NOT open input GENIE file " << isample << std::endl;
124 return 1;
125 }
126
127
128
129
130 TTree* rwtree = 0;
131 rwtree = dynamic_cast<TTree*>( file->Get("reweighting") );
132 if ( !rwtree )
133 {
134 rwtree = new TTree( "reweighting", "GENIE weights tree" );
135 TTree::SetBranchStyle(1);
136 rwtree->SetAutoSave( 200000000 );
137
138
139 }
140
141
142
143
144
145
146 genie::rew::GReWeightIORecord* rwrec = 0;
147 std::string param_name = genie::rew::GSyst::AsString( param_to_tweak );
148 TBranch* rwbr = rwtree->Branch( param_name.c_str(),
149 "genie::rew::GReWeightIORecord",
150 &rwrec, 32000, 1 );
151 assert(rwbr);
152 rwbr->SetAutoDelete(kFALSE);
153
154
155
156
157
158
159
160
161
162
163
164
165 genie::rew::GSystUncertainty* syser = genie::rew::GSystUncertainty::Instance();
166 double sigpls = syser->OneSigmaErr( param_to_tweak, 1 );
167 double sigmin = syser->OneSigmaErr( param_to_tweak, -1 );
168
169 rwtree->GetUserInfo()->Add( new genie::rew::GReWeightIOBranchDesc( param_name, 0.99, sigpls, sigmin ) );
170
171
172
173 TTree* evtree = dynamic_cast<TTree*>( file->Get("gtree") );
174
175
176
178 evtree->SetBranchAddress( "gmcrec", &mcrec );
179
180
181
182 evtree->AddFriend( rwtree );
183
184
185
186 int nevt_total = evtree->GetEntries();
187
188 double twk = 0.;
189 double wt = 1.;
190
191 for ( int iev=0; iev<nevt_total; ++iev )
192 {
193
194 evtree->GetEntry(iev);
196
197
198
199
200
201
202
203
208 if ( !accept )
209 {
210 rwrec = new genie::rew::GReWeightIORecord();
211 rwrec->SetOriginalEvtNumber(iev);
212 rwtree->Fill();
213 delete rwrec;
214 rwrec=0;
215 continue ;
216 }
217
218 rwrec = new genie::rew::GReWeightIORecord();
219
220 rwrec->SetOriginalEvtNumber( iev );
221
222 twk = -0.5;
223 syst.Set( param_to_tweak, twk );
224 rw.Reconfigure();
225 wt = rw.CalcWeight(evt);
226 rwrec->Insert( twk, wt );
227
228 twk = 0.5;
229 syst.Set( param_to_tweak, twk );
230 rw.Reconfigure();
231 wt = rw.CalcWeight(evt);
232 rwrec->Insert( twk, wt );
233
234 rwtree->Fill();
235
236
237
239 if ( rwrec ) delete rwrec;
240 rwrec = 0;
241
242 }
243
244 file->cd();
245 rwtree->Write("",TObject::kOverwrite);
246
247 delete rwtree;
248 rwtree=0;
249
250 file->Close();
251
252 delete lp;
253
254
255
256
257
258
259
260 TFile* tfile = new TFile( isample.c_str(), "READ" );
261
262
263
264
265 TTree* rwtree_test = dynamic_cast<TTree*>( tfile->Get("reweighting") );
266
267 TList* hdr = rwtree_test->GetUserInfo();
268 assert(hdr);
269
270 int nentries = rwtree_test->GetEntries();
271 int nrw = 0;
272 std::cout << " num of entries of re-test: " << nentries << std::endl;
273 genie::rew::GReWeightIORecord* rwrec_test = 0;
274 rwtree_test->SetBranchAddress( param_name.c_str(), &rwrec_test );
275 for ( int i=0; i<nentries; ++i )
276 {
277 rwtree_test->GetEntry(i);
278
279 int nres = rwrec_test->GetNumOfRWResults();
280 if ( nres <= 0 ) continue;
281 for ( int ir=0; ir<nres; ++ir )
282 {
283 double twk_test = rwrec_test->GetTweak( ir );
284 double wt_test = rwrec_test->GetWeight( ir );
285 std::cout << " twk = " << twk_test << " wt = " << wt_test << std::endl;
286 }
287 nrw++;
288 }
289
290 std::cout << " num of re-weighted results of re-test: " << nrw << std::endl;
291
292
293
294 int nhdr = hdr->GetEntries();
295 for ( int i=0; i<nhdr; ++i )
296 {
297 genie::rew::GReWeightIOBranchDesc* brdesc = dynamic_cast<genie::rew::GReWeightIOBranchDesc*>( hdr->At(i) );
298 std::cout << " branch name: " << brdesc->GetParameterName() << std::endl;
299 std::cout << " parameter: " << brdesc->GetParameterMean() << " "
300 << brdesc->GetParameterSigmaPlus() << " " << brdesc->GetParameterSigmaMinus() << std::endl;
301 }
302
303 return 0;
304
305}
Command line argument parser.
string ArgAsString(char opt)
bool OptionExists(char opt)
was option set?
Generated Event Record. It is a GHepRecord object that can accept / be visited by EventRecordVisitorI...
virtual Interaction * Summary(void) const
Summary information for an interaction.
const XclsTag & ExclTag(void) const
const ProcessInfo & ProcInfo(void) const
MINOS-style ntuple record. Each such ntuple record holds a generated EventRecord object....
void Clear(Option_t *opt="")
A class encapsulating an enumeration of interaction types (EM, Weak-CC, Weak-NC) and scattering types...
bool IsWeakCC(void) const
bool IsQuasiElastic(void) const
Contains minimal information for tagging exclusive processes.
bool IsCharmEvent(void) const