17 #include "TPolyLine3D.h" 
   18 #include "TPolyMarker3D.h" 
   42 int main( 
int argc, 
char** argv ) {
 
   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 ) {
 
  208       double length = p->getLength() ;
 
  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 ;
 
  323       double L = p->getLength() ;
 
  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 
 
int read(const int argc, const char *const argv[])
Parse the program's command line options. 
 
Utility class to parse 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. 
 
int main(int argc, char *argv[])