43 cout <<
"MarkovPathReader" << endl
44 <<
"Written by Martijn Jongen" << endl
54 zap[
"f"] =
make_field(ifnames,
"input file names (binary files containing JPhotonPaths)") ;
55 zap[
"m"] =
make_field(ifname_model,
"input file name (root file containing JScatteringModel)") ;
56 zap[
"o"] =
make_field(ofname,
"file name for root output") ;
57 zap[
"P"] =
make_field(Pscat,
"list of Pscat for each nscat") ;
63 if (zap.
read(argc, argv) != 0) {
67 catch(
const exception &error) {
68 cout << error.what() << endl ;
69 cout <<
"Type '" << argv[0] <<
" -h!' to display the command-line options." << endl ;
114 TFile*
f =
new TFile(ifname_model.c_str(),
"read") ;
115 if( f->IsZombie() ) {
116 cerr <<
"Could not open file '" << ifname_model <<
"'." << endl ;
121 cerr <<
"Could not read JScatteringModel from file!" << endl ;
124 cout <<
"JScatteringModel loaded" << endl
125 <<
" absorption length = " << sm->getAbsorptionLength() <<
" m" << endl
135 cout <<
"Reading files." << endl ;
137 cout <<
"Reading '" << *it <<
"'." << endl ;
140 reader.
open(it->c_str()) ;
142 cerr <<
"FATAL ERROR: unable to open input file '" << *it <<
"'." << endl ;
150 if( nscat >= (
int)paths.size() ) paths.resize(nscat+1) ;
151 paths[nscat].push_back(*p) ;
154 cout <<
"--> read " << nread <<
" paths." << endl ;
158 cout <<
"Done reading paths." << endl ;
161 const int nscatmax = paths.size() ;
164 Pscat.resize( nscatmax ) ;
166 for(
int nscat=0 ; nscat<nscatmax ; ++nscat ) {
168 if( Pscat[nscat]>0 && paths[nscat].size()>0 ) {
169 weight[nscat] = Pscat[nscat] / paths[nscat].size() ;
174 cout << setw(5) <<
"nscat" << setw(15) <<
"npaths" << setw(15) <<
"Pscat" << endl ;
175 for(
int nscat=0; nscat<nscatmax; ++nscat ) {
176 if( paths[nscat].size() > 0 ) {
177 cout << setw(5) << nscat
178 << setw(15) << paths[nscat].size()
179 << setw(15) << Pscat[nscat]
184 cout <<
"Determining histogram ranges." << endl ;
190 double INF = 1.0/0.0 ;
191 double MININF = -1.0/0.0 ;
192 for(
int nscat=0 ; nscat<nscatmax ; ++nscat ) {
197 int nvert = nscat + 2 ;
198 for(
int j=0 ;
j<nvert ; ++
j ) {
205 for(
int nscat=0 ; nscat<(int)paths.size() ; ++nscat ) {
209 if( length > Lmax[nscat] ) Lmax[nscat] = length ;
210 if( length < Lmin[nscat] ) Lmin[nscat] = length ;
212 int nvert = nscat + 2 ;
213 for(
int j=0 ;
j<nvert ; ++
j ) {
215 min(posmin[nscat][
j].getY(),p->at(
j).getY()),
216 min(posmin[nscat][
j].getZ(),p->at(
j).getZ()) ) ;
218 max(posmax[nscat][
j].getY(),p->at(
j).getY()),
219 max(posmax[nscat][
j].getZ(),p->at(
j).getZ()) ) ;
225 cout <<
"Allocating histograms." << endl ;
239 int nbins_L = 10000 ;
240 int nbins_ct = 10000 ;
245 for(
int nscat=0 ; nscat<nscatmax ; ++nscat ) {
246 if( paths[nscat].size() == 0 )
continue ;
251 sprintf( hname,
"hL_nscat_%i", nscat ) ;
252 sprintf( htitle,
"path length distribution of paths with %i scatterings.", nscat ) ;
253 hL[nscat] =
new TH1F(hname,htitle,nbins_L,Lmin[nscat],1.01*Lmax[nscat]) ;
255 sprintf( hname,
"hL_zoom_nscat_%i", nscat ) ;
256 sprintf( htitle,
"path length distribution of paths with %i scatterings.", nscat ) ;
257 hL_zoom[nscat] =
new TH1F(hname,htitle,nbins_L,Lmin[nscat],Lmin[nscat]+10) ;
259 double ctmax = 1+1e-8 ;
260 sprintf( hname,
"hCosThetaSource_nscat_%i", nscat ) ;
261 sprintf( htitle,
"Source angle with %i scatterings;cos(#theta_{S});a.u.", nscat ) ;
262 hCosThetaSource[nscat] =
new TH1F(hname,htitle,nbins_ct,-ctmax,ctmax) ;
264 sprintf( hname,
"hCosThetaTarget_nscat_%i", nscat ) ;
265 sprintf( htitle,
"Target angle with %i scatterings;cos(#theta_{T});a.u.", nscat ) ;
266 hCosThetaTarget[nscat] =
new TH1F(hname,htitle,nbins_ct,-ctmax,ctmax) ;
268 sprintf( hname,
"hCosThetaTarget_L_nscat_%i", nscat ) ;
269 sprintf( htitle,
"%i scatterings;cos(#theta_{T});path length L", nscat ) ;
270 hCosThetaTarget_L[nscat] =
new TH2F(hname,htitle,20,-ctmax,ctmax,200,Lmin[nscat],1.01*Lmax[nscat]) ;
271 hCosThetaTarget_L[nscat]->SetOption(
"colz") ;
273 int nvert = nscat + 2 ;
274 hX[nscat].resize(nvert) ;
275 hY[nscat].resize(nvert) ;
276 hZ[nscat].resize(nvert) ;
277 hXY[nscat].resize(nvert) ;
278 hXZ[nscat].resize(nvert) ;
279 hYZ[nscat].resize(nvert) ;
280 for(
int j=0 ;
j<nvert; ++
j ) {
281 sprintf(hname,
"hX_nscat_%i_vertex_%i", nscat,
j ) ;
282 sprintf(htitle,
"X of vertex %i in paths with %i scatterings.",
j, nscat ) ;
283 hX[nscat][
j] =
new TH1F(hname,htitle,nbins_X,1.01*posmin[nscat][
j].getX(),1.01*posmax[nscat][
j].getX()) ;
285 sprintf(hname,
"hY_nscat_%i_vertex_%i", nscat,
j ) ;
286 sprintf(htitle,
"Y of vertex %i in paths with %i scatterings.",
j, nscat ) ;
287 hY[nscat][
j] =
new TH1F(hname,htitle,nbins_Y,1.01*posmin[nscat][
j].getY(),1.01*posmax[nscat][
j].getY()) ;
289 sprintf(hname,
"hZ_nscat_%i_vertex_%i", nscat,
j ) ;
290 sprintf(htitle,
"Z of vertex %i in paths with %i scatterings.",
j, nscat ) ;
291 hZ[nscat][
j] =
new TH1F(hname,htitle,nbins_Z,1.01*posmin[nscat][
j].getZ(),1.01*posmax[nscat][
j].getZ()) ;
293 sprintf(hname,
"hXY_nscat_%i_vertex_%i", nscat,
j ) ;
294 sprintf(htitle,
"XY of vertex %i in paths with %i scatterings.",
j, nscat ) ;
295 hXY[nscat][
j] =
new TH2F(hname,htitle,
296 nbins_X,1.01*posmin[nscat][
j].getX(),1.01*posmax[nscat][
j].getX(),
297 nbins_Y,1.01*posmin[nscat][
j].getY(),1.01*posmax[nscat][
j].getY() ) ;
298 hXY[nscat][
j]->SetOption(
"colz") ;
300 sprintf(hname,
"hXZ_nscat_%i_vertex_%i", nscat,
j ) ;
301 sprintf(htitle,
"XZ of vertex %i in paths with %i scatterings.",
j, nscat ) ;
302 hXZ[nscat][
j] =
new TH2F(hname,htitle,
303 nbins_X,1.01*posmin[nscat][
j].getX(),1.01*posmax[nscat][
j].getX(),
304 nbins_Z,1.01*posmin[nscat][
j].getZ(),1.01*posmax[nscat][
j].getZ() ) ;
305 hXZ[nscat][
j]->SetOption(
"colz") ;
307 sprintf(hname,
"hYZ_nscat_%i_vertex_%i", nscat,
j ) ;
308 sprintf(htitle,
"YZ of vertex %i in paths with %i scatterings.",
j, nscat ) ;
309 hYZ[nscat][
j] =
new TH2F(hname,htitle,
310 nbins_Y,1.01*posmin[nscat][
j].getY(),1.01*posmax[nscat][
j].getY(),
311 nbins_Z,1.01*posmin[nscat][
j].getZ(),1.01*posmax[nscat][
j].getZ() ) ;
312 hYZ[nscat][
j]->SetOption(
"colz") ;
318 cout <<
"Filling histograms." << endl ;
319 for(
int nscat=0 ; nscat<(int)paths.size() ; ++nscat ) {
320 int nvert = nscat + 2 ;
325 hL_zoom[nscat]->Fill(L) ;
329 hCosThetaSource[nscat]->Fill(seg.getDZ()) ;
334 hCosThetaTarget[nscat]->Fill(seg.getDZ()) ;
335 hCosThetaTarget_L[nscat]->Fill(seg.getDZ(),L) ;
338 for(
int j=0;
j<nvert; ++
j ) {
339 double x = p->at(
j).getX() ;
340 double y = p->at(
j).getY() ;
341 double z = p->at(
j).getZ() ;
342 hX[nscat][
j]->Fill(x) ;
343 hY[nscat][
j]->Fill(y) ;
344 hZ[nscat][
j]->Fill(z) ;
345 hXY[nscat][
j]->Fill(x,y) ;
346 hXZ[nscat][
j]->Fill(x,z) ;
347 hYZ[nscat][
j]->Fill(y,z) ;
354 cout <<
"Normalizing histograms." << endl ;
355 for(
int nscat=0 ; nscat<nscatmax ; ++nscat ) {
356 if( paths[nscat].size() == 0 )
continue ;
357 int nvert = nscat + 2 ;
358 hL[nscat]->Scale(
weight[nscat] ) ;
359 hL_zoom[nscat]->Scale(
weight[nscat] ) ;
360 hCosThetaSource[nscat]->Scale(
weight[nscat] ) ;
361 hCosThetaTarget[nscat]->Scale(
weight[nscat] ) ;
362 for(
int j=0 ;
j<nvert; ++
j ) {
363 hX[nscat][
j]->Scale(
weight[nscat] ) ;
364 hY[nscat][
j]->Scale(
weight[nscat] ) ;
365 hZ[nscat][
j]->Scale(
weight[nscat] ) ;
366 hXY[nscat][
j]->Scale(
weight[nscat] ) ;
367 hXZ[nscat][
j]->Scale(
weight[nscat] ) ;
368 hYZ[nscat][
j]->Scale(
weight[nscat] ) ;
373 cout <<
"Writing results to '" << ofname <<
"'." << endl ;
374 TFile* fout =
new TFile(ofname.c_str(),
"recreate") ;
375 for(
int nscat=0; nscat<nscatmax; ++nscat ) {
376 if( paths[nscat].size() == 0 )
continue ;
377 int nvert = nscat + 2 ;
380 sprintf( dname,
"nscat%i", nscat ) ;
381 gDirectory->mkdir(dname)->cd() ;
383 hL_zoom[nscat]->Write() ;
384 hCosThetaSource[nscat]->Write() ;
385 hCosThetaTarget[nscat]->Write() ;
386 hCosThetaTarget_L[nscat]->Write() ;
387 for(
int j=0;
j<nvert ; ++
j ) {
388 hX[nscat][
j]->Write() ;
389 hY[nscat][
j]->Write() ;
390 hZ[nscat][
j]->Write() ;
391 hXY[nscat][
j]->Write() ;
392 hXZ[nscat][
j]->Write() ;
393 hYZ[nscat][
j]->Write() ;
400 cout <<
"Output written to '" << ofname <<
"'." << endl ;
402 cout <<
"Done!" << endl ;
Utility class to parse command line options.
virtual const pointer_type & next()
Get next element.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
then print u2 $script< option > print u2 Possible continue
int read(const int argc, const char *const argv[])
Parse the program's command line options.
Virtual base class for a scattering model.
virtual bool hasNext()
Check availability of next element.
Data structure for position in three dimensions.
virtual double getScatteringLength()
Data structure for normalised vector in three dimensions.
double getLength()
get the total path length
std::vector< double > weight