Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
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
 
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.
 
vector< double > dummy_integrate (int N, int nscat, JSourceModel *src, JScatteringModel *sm, JTargetModel *trg, double lambda_abs)
 Integrate a test function with N samples.
 
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.
 

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
 
int getIndex (int nv, int nscat)
 return the internal index for a given number of scatterings and vertex number
 
void initgenerators (int nscat)
 initialize the position generators for a given number of scatterings (i.e. create histograms and fill them from the ensemble)
 
void init_target_generator (int nscat)
 initialize the generator for a target vertex for a given number of scatterings
 
void free_target_gens ()
 
virtual JPhotonPath generatePath (int nscat, double &winv)
 Generate a random photon path with a given number of scatterings.
 

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) {}
JMarkovEnsembleIntegrator(const vector< JPhotonPath > &_ensemble, JTargetModel *_trg, int _nbinsx, int _nbinsy, int _nbinsz)

◆ ~JMarkovEnsembleIntegrator3D()

JMARKOV::JMarkovEnsembleIntegrator3D::~JMarkovEnsembleIntegrator3D ( )
inline

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 }
vector< J3DhistGenerator * > gens

◆ 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 }
void initgenerators(int nscat)
initialize the position generators for a given number of scatterings (i.e. create histograms and fill...
int getIndex(int nv, int nscat)
return the internal index for a given number of scatterings and vertex number

◆ 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 }
double getY() const
Get y position.
Definition JVector3D.hh:104
double getZ() const
Get z position.
Definition JVector3D.hh:115
double getX() const
Get x position.
Definition JVector3D.hh:94
const double xmax
const double xmin

◆ 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 }
virtual JPosition3D generateScatteringVertexPosition(int nscat, int nv, double &winv)=0
vector< JSphereGenerator * > target_gens

◆ 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 }
virtual void init_scattering_vertex_generators(int nscat)=0
void init_target_generator(int nscat)
initialize the generator for a target vertex for a given number of scatterings

◆ 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 JDirection3D 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 }
const JPosition3D & getPosition() const

◆ 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 }
virtual JPhotonPath generatePath(int nscat, double &winv)
Generate a random photon path with a given number of scatterings.
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.

◆ 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 }
virtual JPosition3D generatePosition(int nscat, int nv, double &winv)=0
Generate a random position for vertex nv.

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: