Jpp
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
JMARKOV::JMarkovEnsembleIntegrator3D Class Reference

This implementation of the JMarkovIntegrator interface generates 'natural' looking paths that might sample the phase space well in some cases. More...

#include <JMarkovIntegrator.hh>

Inheritance diagram for JMARKOV::JMarkovEnsembleIntegrator3D:
JMARKOV::JMarkovEnsembleIntegrator JMARKOV::JMarkovIntegrator

Public Member Functions

 JMarkovEnsembleIntegrator3D (const vector< JPhotonPath > &_ensemble, JTargetModel *_trg, int _nbinsx, int _nbinsy, int _nbinsz, JPosition3D _posmin, JPosition3D _posmax)
 
 ~JMarkovEnsembleIntegrator3D ()
 
void free_scattering_vertex_gens ()
 
void writeHistograms ()
 write the histograms filled from the ensemble More...
 
JPosition3D generateScatteringVertexPosition (int nscat, int nv, double &winv)
 
vector< double > integrate (int N, int nscat, JSourceModel *src, JScatteringModel *sm, JTargetModel *trg, double lambda_abs)
 Integrate with N samples. More...
 
vector< double > dummy_integrate (int N, int nscat, JSourceModel *src, JScatteringModel *sm, JTargetModel *trg, double lambda_abs)
 Integrate a test function with N samples. More...
 
vector< JPhotonPathget_diagnostic_ensemble (int N, int nscat, JSourceModel *src, JScatteringModel *sm, JTargetModel *trg, double lambda_abs)
 Return photon paths generated with the generatePath method. More...
 

Protected Member Functions

void init_scattering_vertex_generators (int nscat)
 
JPosition3D generatePosition (int nscat, int nv, double &winv)
 generate a position for vertex nv for the given number of scatterings, winv will be set to 1/weight More...
 
int getIndex (int nv, int nscat)
 return the internal index for a given number of scatterings and vertex number More...
 
void initgenerators (int nscat)
 initialize the position generators for a given number of scatterings (i.e. create histograms and fill them from the ensemble) More...
 
void init_target_generator (int nscat)
 initialize the generator for a target vertex for a given number of scatterings More...
 
void free_target_gens ()
 
virtual JPhotonPath generatePath (int nscat, double &winv)
 Generate a random photon path with a given number of scatterings. More...
 

Protected Attributes

vector< J3DhistGenerator * > gens
 
JPosition3D posmin
 
JPosition3D posmax
 
vector< JSphereGenerator * > target_gens
 
vector< JPhotonPathensemble
 
int nbinsx
 
int nbinsy
 
int nbinsz
 
JTargetModeltrg
 
JPosition3D source_position
 

Detailed Description

This implementation of the JMarkovIntegrator interface generates 'natural' looking paths that might sample the phase space well in some cases.

Similar to JMarkovEnsembleIntegrator, but using a 3D histogram for each vertex instead of 3 1D histograms.

Definition at line 473 of file JMarkovIntegrator.hh.

Constructor & Destructor Documentation

◆ JMarkovEnsembleIntegrator3D()

JMARKOV::JMarkovEnsembleIntegrator3D::JMarkovEnsembleIntegrator3D ( const vector< JPhotonPath > &  _ensemble,
JTargetModel _trg,
int  _nbinsx,
int  _nbinsy,
int  _nbinsz,
JPosition3D  _posmin,
JPosition3D  _posmax 
)
inline

Definition at line 477 of file JMarkovIntegrator.hh.

477 : JMarkovEnsembleIntegrator(_ensemble,_trg,_nbinsx,_nbinsy,_nbinsz), posmin(_posmin), posmax(_posmax) {}

◆ ~JMarkovEnsembleIntegrator3D()

JMARKOV::JMarkovEnsembleIntegrator3D::~JMarkovEnsembleIntegrator3D ( )
inline

Definition at line 479 of file JMarkovIntegrator.hh.

479  {
480  free_target_gens() ;
482  }

Member Function Documentation

◆ free_scattering_vertex_gens()

void JMARKOV::JMarkovEnsembleIntegrator3D::free_scattering_vertex_gens ( )
inline

Definition at line 484 of file JMarkovIntegrator.hh.

484  {
485  // free memory
486  for( vector<J3DhistGenerator*>::iterator it=gens.begin() ; it!=gens.end() ; ++it ) {
487  if( *it != NULL ) delete *it ;
488  }
489  }

◆ writeHistograms()

void JMARKOV::JMarkovEnsembleIntegrator3D::writeHistograms ( )
inlinevirtual

write the histograms filled from the ensemble

Implements JMARKOV::JMarkovEnsembleIntegrator.

Definition at line 491 of file JMarkovIntegrator.hh.

491  {
492  for( vector<J3DhistGenerator*>::iterator it=gens.begin() ; it!=gens.end() ; ++it ) {
493  if( *it != NULL ) {
494  (*it)->h->Write() ;
495  TH2D* htmp ;
496  htmp = (TH2D*)(*it)->h->Project3D("yx") ;
497  htmp->SetOption("colz") ;
498  htmp->SetEntries(10) ;
499  htmp->Write() ;
500  htmp = (TH2D*)(*it)->h->Project3D("yz") ;
501  htmp->SetOption("colz") ;
502  htmp->SetEntries(10) ;
503  htmp->Write() ;
504  htmp = (TH2D*)(*it)->h->Project3D("zx") ;
505  htmp->SetOption("colz") ;
506  htmp->SetEntries(10) ;
507  htmp->Write() ;
508  }
509  }
510  }

◆ generateScatteringVertexPosition()

JPosition3D JMARKOV::JMarkovEnsembleIntegrator3D::generateScatteringVertexPosition ( int  nscat,
int  nv,
double &  winv 
)
inlinevirtual

Implements JMARKOV::JMarkovEnsembleIntegrator.

Definition at line 512 of file JMarkovIntegrator.hh.

512  {
513  int index = getIndex(nv,nscat) ;
514  if( index+1>(int)gens.size() || gens[index] == NULL ) initgenerators(nscat) ;
515 
516  JPosition3D pos = gens[index]->getPosition() ;
517  winv = 1.0/gens[index]->getWeight(pos) ;
518  return pos ;
519  }

◆ init_scattering_vertex_generators()

void JMARKOV::JMarkovEnsembleIntegrator3D::init_scattering_vertex_generators ( int  nscat)
inlineprotectedvirtual

Implements JMARKOV::JMarkovEnsembleIntegrator.

Definition at line 523 of file JMarkovIntegrator.hh.

523  {
524  int ifirst = getIndex(1,nscat) ;
525  int ilast = getIndex(1,nscat+1) ;
526  if( (int)gens.size() < ilast ) gens.resize( ilast, NULL ) ;
527 
528  for( int nv=1 ; nv<=nscat ; ++nv ) {
529  int index = ifirst + nv - 1 ;
530  // determine minimal and maximal value
531  double xmin = 1.0/0.0 ;
532  double xmax = -1.0/0.0 ;
533  double ymin = 1.0/0.0 ;
534  double ymax = -1.0/0.0 ;
535  double zmin = 1.0/0.0 ;
536  double zmax = -1.0/0.0 ;
537  xmin = posmin.getX() ;
538  ymin = posmin.getY() ;
539  zmin = posmin.getZ() ;
540  xmax = posmax.getX() ;
541  ymax = posmax.getY() ;
542  zmax = posmax.getZ() ;
543  // allocate histogram
544  char hname[200] ;
545  sprintf( hname, "h3_nscat%i_vtx%i", nscat, nv ) ;
546  TH3F h(hname,"Vertex position;X;Y;Z",
547  nbinsx,xmin,xmax,
548  nbinsy,ymin,ymax,
549  nbinsz,zmin,zmax ) ;
550  // fill histogram from ensemble
551  for( vector<JPhotonPath>::iterator it=ensemble.begin() ; it!=ensemble.end() ; ++it ) {
552  if( it->n-2 != nscat ) continue ;
553  JPosition3D vtx( (*it)[nv] ) ;
554  h.Fill( vtx.getX(), vtx.getY(), vtx.getZ() ) ;
555  }
556  // extra: make sure every field is filled at least once
557  double excuseval = 0.01*h.Integral() / ( h.GetNbinsX() * h.GetNbinsY() * h.GetNbinsZ() ) ;
558  for( Int_t xbin=1 ; xbin<=h.GetNbinsX() ; ++xbin ) {
559  for( Int_t ybin=1 ; ybin<=h.GetNbinsY() ; ++ybin ) {
560  for( Int_t zbin=1 ; zbin<=h.GetNbinsZ() ; ++zbin ) {
561  Int_t bin = h.GetBin(xbin,ybin,zbin) ;
562  h.AddBinContent(bin,excuseval) ;
563  }
564  }
565  }
566  gens[index] = new J3DhistGenerator( &h ) ;
567  }
568  }

◆ generatePosition()

JPosition3D JMARKOV::JMarkovEnsembleIntegrator::generatePosition ( int  nscat,
int  nv,
double &  winv 
)
inlineprotectedvirtualinherited

generate a position for vertex nv for the given number of scatterings, winv will be set to 1/weight

Implements JMARKOV::JMarkovIntegrator.

Definition at line 228 of file JMarkovIntegrator.hh.

228  {
229  // source vertex
230  if( nv==0 ) {
231  winv = 1.0 ;
232  return source_position ;
233  }
234  // target vertex
235  if( nv == nscat+1 ) {
236  if( nscat+1>(int)target_gens.size() || target_gens[nscat] == NULL ) {
237  initgenerators(nscat) ;
238  }
239  JPosition3D pos = target_gens[nscat]->getPosition() ;
240  winv = 1.0/target_gens[nscat]->getWeight(pos) ;
241  return pos ;
242  } else {
243  // scattering vertex
244  return generateScatteringVertexPosition(nscat,nv,winv) ;
245  }
246  }

◆ getIndex()

int JMARKOV::JMarkovEnsembleIntegrator::getIndex ( int  nv,
int  nscat 
)
inlineprotectedinherited

return the internal index for a given number of scatterings and vertex number

Definition at line 251 of file JMarkovIntegrator.hh.

251  {
252  // indices are distributed as follows
253  // [0]: nscat=1, nv=1
254  // [1]: nscat=2, nv=1
255  // [2]: nscat=2, nv=2
256  // [3]: nscat=3, nv=1
257  // [4]: nscat=3, nv=2
258  // etc.
259  return (nscat*(nscat-1))/2 + nv - 1 ;
260  }

◆ initgenerators()

void JMARKOV::JMarkovEnsembleIntegrator::initgenerators ( int  nscat)
inlineprotectedinherited

initialize the position generators for a given number of scatterings (i.e. create histograms and fill them from the ensemble)

Definition at line 263 of file JMarkovIntegrator.hh.

263  {
264  // target vertex
265  init_target_generator(nscat) ;
266 
267  // scattering vertices
269  }

◆ init_target_generator()

void JMARKOV::JMarkovEnsembleIntegrator::init_target_generator ( int  nscat)
inlineprotectedinherited

initialize the generator for a target vertex for a given number of scatterings

Definition at line 272 of file JMarkovIntegrator.hh.

272  {
273  if( (int)target_gens.size() <= nscat ) target_gens.resize( nscat+1 ) ;
274 
275  if( trg->getRadius()>0 ) {
276  // for a finite target, we fill a "sphere generator" from the ensemble
277  char hname[200] ;
278  sprintf( hname, "htarget_nscat%i", nscat ) ;
279  TH2D* ht = new TH2D(hname,";cos(#theta);#phi",100,-1,1,100,-M_PI,M_PI) ;
280  for( vector<JPhotonPath>::iterator it=ensemble.begin() ; it!=ensemble.end() ; ++it ) {
281  if( it->n-2 != nscat ) continue ;
282  JVersor3D dir( it->back() - trg->getPosition() ) ;
283  ht->Fill( dir.getDZ(), dir.getPhi() ) ;
284  }
285  target_gens[nscat] = new JSphereGenerator( trg->getPosition(), trg->getRadius(), ht ) ;
286  delete ht ;
287  } else {
288  // for an infinitesimal target, we create a "generator" that only generates the single point
289  target_gens[nscat] = new JSphereGenerator( trg->getPosition() ) ;
290  }
291  }

◆ free_target_gens()

void JMARKOV::JMarkovEnsembleIntegrator::free_target_gens ( )
inlineprotectedinherited

Definition at line 295 of file JMarkovIntegrator.hh.

295  {
296  for( vector<JSphereGenerator*>::iterator it=target_gens.begin() ; it!=target_gens.end() ; ++it ) {
297  if( *it != NULL ) delete *it ;
298  }
299  }

◆ integrate()

vector< double > JMARKOV::JMarkovIntegrator::integrate ( int  N,
int  nscat,
JSourceModel src,
JScatteringModel sm,
JTargetModel trg,
double  lambda_abs 
)
inherited

Integrate with N samples.

Returns a vector with the contribution to the integral of each sample. The mean of those values is the estimate of the result of the integral, while the distribution itself can be used to estimate the stability of the result. In this distribution, you want to avoid

  • long tails (because they make the result unstable)
  • small contributions (because it means that parts of the parameter space are being oversampled, so it is less efficient) This can be achieved by tuning the sample distribution to the problem at hand.

Definition at line 130 of file JMarkovIntegrator.hh.

130  {
131  vector<double> contributions(N,-1) ;
132 
133  for( int i=0 ; i<N ; ++i ) {
134  double winv ;
135  JPhotonPath p = generatePath(nscat,winv) ;
136 
137  double rho = getPhotonPathProbabilityDensity(p,src,sm,trg,lambda_abs) ;
138  contributions[i] = rho * winv ;
139  }
140  return contributions ;
141  }

◆ dummy_integrate()

vector< double > JMARKOV::JMarkovIntegrator::dummy_integrate ( int  N,
int  nscat,
JSourceModel src,
JScatteringModel sm,
JTargetModel trg,
double  lambda_abs 
)
inherited

Integrate a test function with N samples.

This can be used as a sanity check for derived classes of JMarkovIntegrator.

The integral should yield 1 when the complete relevant part of the volume is taken into account. If it does not, it may be a sign that the implementation is not correct.

Returns a vector with the contribution to the integral of each sample.

Definition at line 143 of file JMarkovIntegrator.hh.

143  {
144  vector<double> contributions(N,-1) ;
145 
146  for( int i=0 ; i<N ; ++i ) {
147  const double r = 10 ;
148  double winv ;
149  JPhotonPath p = generatePath(nscat,winv) ;
150  double rho = 1.0/(4.0/3.0*M_PI*r*r*r) ;
151  if( p[1].getLength()>r ) rho = 0 ;
152  contributions[i] = rho * winv ;
153  }
154  return contributions ;
155  }

◆ get_diagnostic_ensemble()

vector< JPhotonPath > JMARKOV::JMarkovIntegrator::get_diagnostic_ensemble ( int  N,
int  nscat,
JSourceModel src,
JScatteringModel sm,
JTargetModel trg,
double  lambda_abs 
)
inherited

Return photon paths generated with the generatePath method.

This can be used to identify the parts of parameter space that are over- or undersampled in a given problem so that the integrator may be optimized to handle those better.

Definition at line 157 of file JMarkovIntegrator.hh.

157  {
158  vector<JPhotonPath> paths ;
159 
160  for( int i=0 ; i<N ; ++i ) {
161  double winv ;
162  JPhotonPath p = generatePath(nscat,winv) ;
163  paths.push_back(p) ;
164  }
165  return paths ;
166  }

◆ generatePath()

virtual JPhotonPath JMARKOV::JMarkovIntegrator::generatePath ( int  nscat,
double &  winv 
)
inlineprotectedvirtualinherited

Generate a random photon path with a given number of scatterings.

winv must be set to the inverted probability density to generate this particular path.

Definition at line 94 of file JMarkovIntegrator.hh.

94  {
95  // this default implementation assumes that the vertex positions
96  // are completely uncorrelated
97  JPhotonPath p(nscat) ;
98  double _winv = 1 ;
99  for( int nv=0 ; nv<nscat+2 ; ++nv ) {
100  double part_winv ;
101  p[nv] = generatePosition( nscat, nv, part_winv ) ;
102  _winv *= part_winv ;
103  }
104  winv = _winv ;
105  return p ;
106  }

Member Data Documentation

◆ gens

vector<J3DhistGenerator*> JMARKOV::JMarkovEnsembleIntegrator3D::gens
protected

Definition at line 570 of file JMarkovIntegrator.hh.

◆ posmin

JPosition3D JMARKOV::JMarkovEnsembleIntegrator3D::posmin
protected

Definition at line 571 of file JMarkovIntegrator.hh.

◆ posmax

JPosition3D JMARKOV::JMarkovEnsembleIntegrator3D::posmax
protected

Definition at line 572 of file JMarkovIntegrator.hh.

◆ target_gens

vector<JSphereGenerator*> JMARKOV::JMarkovEnsembleIntegrator::target_gens
protectedinherited

Definition at line 301 of file JMarkovIntegrator.hh.

◆ ensemble

vector<JPhotonPath> JMARKOV::JMarkovEnsembleIntegrator::ensemble
protectedinherited

Definition at line 302 of file JMarkovIntegrator.hh.

◆ nbinsx

int JMARKOV::JMarkovEnsembleIntegrator::nbinsx
protectedinherited

Definition at line 303 of file JMarkovIntegrator.hh.

◆ nbinsy

int JMARKOV::JMarkovEnsembleIntegrator::nbinsy
protectedinherited

Definition at line 304 of file JMarkovIntegrator.hh.

◆ nbinsz

int JMARKOV::JMarkovEnsembleIntegrator::nbinsz
protectedinherited

Definition at line 305 of file JMarkovIntegrator.hh.

◆ trg

JTargetModel* JMARKOV::JMarkovEnsembleIntegrator::trg
protectedinherited

Definition at line 306 of file JMarkovIntegrator.hh.

◆ source_position

JPosition3D JMARKOV::JMarkovEnsembleIntegrator::source_position
protectedinherited

Definition at line 307 of file JMarkovIntegrator.hh.


The documentation for this class was generated from the following file:
JMARKOV::JMarkovEnsembleIntegrator::JMarkovEnsembleIntegrator
JMarkovEnsembleIntegrator(const vector< JPhotonPath > &_ensemble, JTargetModel *_trg, int _nbinsx, int _nbinsy, int _nbinsz)
Definition: JMarkovIntegrator.hh:202
JMARKOV::JMarkovEnsembleIntegrator::nbinsx
int nbinsx
Definition: JMarkovIntegrator.hh:303
JMARKOV::JMarkovEnsembleIntegrator::nbinsy
int nbinsy
Definition: JMarkovIntegrator.hh:304
JMARKOV::JMarkovEnsembleIntegrator3D::free_scattering_vertex_gens
void free_scattering_vertex_gens()
Definition: JMarkovIntegrator.hh:484
JGEOMETRY3D::JVector3D::getZ
double getZ() const
Get z position.
Definition: JVector3D.hh:114
JMARKOV::JMarkovEnsembleIntegrator3D::posmin
JPosition3D posmin
Definition: JMarkovIntegrator.hh:571
JMARKOV::JMarkovEnsembleIntegrator3D::posmax
JPosition3D posmax
Definition: JMarkovIntegrator.hh:572
JMARKOV::JMarkovEnsembleIntegrator::init_target_generator
void init_target_generator(int nscat)
initialize the generator for a target vertex for a given number of scatterings
Definition: JMarkovIntegrator.hh:272
JMARKOV::JMarkovEnsembleIntegrator::generateScatteringVertexPosition
virtual JPosition3D generateScatteringVertexPosition(int nscat, int nv, double &winv)=0
JMARKOV::JMarkovEnsembleIntegrator::source_position
JPosition3D source_position
Definition: JMarkovIntegrator.hh:307
JMARKOV::JSphereGenerator
Implementation of the JGenerator interface.
Definition: JMarkovGenerator.hh:582
JMARKOV::JMarkovEnsembleIntegrator::ensemble
vector< JPhotonPath > ensemble
Definition: JMarkovIntegrator.hh:302
JMARKOV::JMarkovEnsembleIntegrator::free_target_gens
void free_target_gens()
Definition: JMarkovIntegrator.hh:295
JMARKOV::JMarkovIntegrator::generatePosition
virtual JPosition3D generatePosition(int nscat, int nv, double &winv)=0
Generate a random position for vertex nv.
JMARKOV::JMarkovEnsembleIntegrator::target_gens
vector< JSphereGenerator * > target_gens
Definition: JMarkovIntegrator.hh:301
JMARKOV::JMarkovEnsembleIntegrator3D::gens
vector< J3DhistGenerator * > gens
Definition: JMarkovIntegrator.hh:570
JMARKOV::JPhotonPath
A photon path.
Definition: JPhotonPath.hh:38
JMARKOV::JMarkovEnsembleIntegrator::init_scattering_vertex_generators
virtual void init_scattering_vertex_generators(int nscat)=0
JMARKOV::JMarkovEnsembleIntegrator::getIndex
int getIndex(int nv, int nscat)
return the internal index for a given number of scatterings and vertex number
Definition: JMarkovIntegrator.hh:251
JMARKOV::JMarkovEnsembleIntegrator::trg
JTargetModel * trg
Definition: JMarkovIntegrator.hh:306
JMARKOV::JMarkovIntegrator::generatePath
virtual JPhotonPath generatePath(int nscat, double &winv)
Generate a random photon path with a given number of scatterings.
Definition: JMarkovIntegrator.hh:94
JMARKOV::JMarkovEnsembleIntegrator::initgenerators
void initgenerators(int nscat)
initialize the position generators for a given number of scatterings (i.e. create histograms and fill...
Definition: JMarkovIntegrator.hh:263
JMARKOV::getPhotonPathProbabilityDensity
double getPhotonPathProbabilityDensity(JPhotonPath &p, JSourceModel *src, JScatteringModel *sm, JTargetModel *trg, double lambda_abs)
Return the probability density for a photon path with the given ingredients.
Definition: JScatteringModel.hh:582
JMARKOV::J3DhistGenerator
Implementation of the JGenerator interface.
Definition: JMarkovGenerator.hh:656
JMARKOV::JTargetModel::getRadius
double getRadius() const
Definition: JScatteringModel.hh:301
JGEOMETRY3D::JVector3D::getY
double getY() const
Get y position.
Definition: JVector3D.hh:103
JMARKOV::JTargetModel::getPosition
const JPosition3D & getPosition() const
Definition: JScatteringModel.hh:304
JTOOLS::r
data_type r[M+1]
Definition: JPolint.hh:709
JGEOMETRY3D::JVector3D::getX
double getX() const
Get x position.
Definition: JVector3D.hh:93
JMARKOV::JMarkovEnsembleIntegrator::nbinsz
int nbinsz
Definition: JMarkovIntegrator.hh:305