130 #define BXOPE std::cout<<\ 131 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"<<std::endl<<\ 133 #define BXTXT(text) std::cout<<\ 134 "F "<<std::setw(40)<< text <<" F"<<std::endl 135 #define BX1I(name,numb,text) std::cout<<\ 136 "F "<<std::setw(10)<<name<<" = "<<std::setw(10)<<numb<<" = " <<std::setw(50)<<text<<" F"<<std::endl 137 #define BX1F(name,numb,text) std::cout<<"F "<<std::setw(10)<<name<<\ 138 " = "<<std::setw(15)<<std::setprecision(8)<<numb<<" = "<<std::setw(40)<<text<<" F"<<std::endl 139 #define BX2F(name,numb,err,text) std::cout<<"F "<<std::setw(10)<<name<<\ 140 " = "<<std::setw(15)<<std::setprecision(8)<<numb<<" +- "<<std::setw(15)<<std::setprecision(8)<<err<< \ 141 " = "<<std::setw(25)<<text<<" F"<<std::endl 142 #define BXCLO std::cout<<\ 144 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"<<std::endl 150 #define SW2 setprecision(7) << std::setw(12) 159 FoamIntegrandFunction(FunctionPtr
func) : fFunc(func) {}
161 virtual ~FoamIntegrandFunction() {}
165 return fFunc(nDim,x);
179 fDim(0), fNCells(0), fRNmax(0),
180 fOptDrive(0), fChat(0), fOptRej(0),
181 fNBin(0), fNSampl(0), fEvPerBin(0),
182 fMaskDiv(0), fInhiDiv(0), fOptPRD(0), fXdivPRD(0),
183 fNoAct(0), fLastCe(0), fCells(0),
184 fMCMonit(0), fMaxWtRej(0), fCellsAct(0), fPrimAcu(0),
185 fHistEdg(0), fHistDbg(0), fHistWt(0),
186 fMCvect(0), fMCwt(0), fRvec(0),
187 fRho(0), fMethodCall(0), fPseRan(0),
188 fNCalls(0), fNEffev(0),
189 fSumWt(0), fSumWt2(0),
190 fSumOve(0), fNevGen(0),
191 fWtMax(0), fWtMin(0),
192 fPrime(0), fMCresult(0), fMCerror(0),
216 if(strlen(Name) >129) {
217 Error(
"TFoam",
"Name too long %s \n",Name);
220 fDate=
" Release date: 2005.04.10";
297 if (
fRho && dynamic_cast<FoamIntegrandFunction*>(
fRho) )
delete fRho;
306 Error(
"TFoam",
"COPY CONSTRUCTOR NOT IMPLEMENTED \n");
364 BXTXT(
"****************************************");
365 BXTXT(
"****** TFoam::Initialize ******");
366 BXTXT(
"****************************************");
369 BX1I(
" kDim",
fDim,
" Dimension of the hyper-cubical space ");
370 BX1I(
" nCells",
fNCells,
" Requested number of Cells (half of them active) ");
371 BX1I(
" nSampl",
fNSampl,
" No of MC events in exploration of a cell ");
372 BX1I(
" nBin",
fNBin,
" No of bins in histograms, MC exploration of cell ");
373 BX1I(
" EvPerBin",
fEvPerBin,
" Maximum No effective_events/bin, MC exploration ");
374 BX1I(
" OptDrive",
fOptDrive,
" Type of Driver =1,2 for Sigma,WtMax ");
375 BX1I(
" OptRej",
fOptRej,
" MC rejection on/off for OptRej=0,1 ");
376 BX1F(
" MaxWtRej",
fMaxWtRej,
" Maximum wt in rejection for wt=1 evts");
380 if(
fPseRan==0)
Error(
"Initialize",
"Random number generator not set \n");
382 if(
fDim==0)
Error(
"Initialize",
"Zero dimension not allowed \n");
390 if(
fRvec==0)
Error(
"Initialize",
"Cannot initialize buffer fRvec \n");
394 if(
fAlpha==0)
Error(
"Initialize",
"Cannot initialize buffer fAlpha \n" );
397 if(
fMCvect==0)
Error(
"Initialize",
"Cannot initialize buffer fMCvect \n" );
422 htitle=TString(
"Edge Histogram No. ");
433 htitle=TString(
"Debug Histogram ");
465 BXTXT(
"*** TFoam::Initialize FINISHED!!! ***");
466 BX1I(
" nCalls",
fNCalls,
"Total number of function calls ");
467 BX1F(
" XPrime",
fPrime,
"Primary total integral ");
468 BX1F(
" XDiver",driver,
"Driver total integral ");
469 BX1F(
" mcResult",
fMCresult,
"Estimate of the true MC Integral ");
495 if(
fCells==0)
Error(
"InitCells",
"Cannot initialize CELLS \n" );
516 Error(
"CellFill",
"Too many cells\n");
523 cell->
Fill(Status, parent, 0, 0);
567 cell->
GetHcub(cellPosi,cellSize);
599 for(j=0; j<
fDim; j++)
600 xRand[j]= cellPosi[j] +
fAlpha[j]*(cellSize[j]);
607 for(k=0; k<
fDim; k++) {
618 if (ceSum[3]>wt) ceSum[3]=wt;
619 if (ceSum[4]<wt) ceSum[4]=wt;
621 nevEff = ceSum[0]*ceSum[0]/ceSum[1];
626 for(k=0; k<
fDim;k++){
634 for(k=0; k<
fDim; k++) {
636 rmax= cellPosi[k] +cellSize[k];
642 if( (rmin +1e-99 <rdiv) && (rdiv< rmax -1e-99)) {
644 xBest= (rdiv-cellPosi[k])/cellSize[k] ;
656 Double_t intTrue = ceSum[0]/(nevMC+0.000001);
662 if(kBest == -1)
Varedu(ceSum,kBest,xBest,yBest);
664 intDriv =
sqrt(ceSum[1]/nevMC) -intTrue;
665 intPrim =
sqrt(ceSum[1]/nevMC);
668 if(kBest == -1)
Carver(kBest,xBest,yBest);
669 intDriv =ceSum[4] -intTrue;
673 Error(
"Explore",
"Wrong fOptDrive = \n" );
687 for(parent = cell->
GetPare(); parent!=0; parent = parent->
GetPare()){
690 parent->
SetIntg( parIntg +intTrue -intOld );
691 parent->
SetDriv( parDriv +intDriv -driOld );
711 Double_t swIn,swOut,sswIn,sswOut,xLo,xUp;
717 for(
Int_t kProj=0; kProj<
fDim; kProj++) {
728 aswIn += ((
TH1D *)(*
fHistEdg)[kProj])->GetBinContent(jUp);
733 swOut = (swAll-aswIn)/nent;
734 sswIn =
sqrt(asswIn) /
sqrt(nent*(xUp-xLo)) *(xUp-xLo);
735 sswOut=
sqrt(sswAll-asswIn)/
sqrt(nent*(1.0-xUp+xLo)) *(1.0-xUp+xLo);
736 if( (sswIn+sswOut) < sswtBest) {
737 sswtBest = sswIn+sswOut;
739 sigmIn = sswIn -swIn;
740 sigmOut = sswOut-swOut;
753 if( ((iBin-0.5)/
fNBin > xMin) && ((iBin-0.5)/
fNBin < xMax) ){
754 ((
TH1D *)(*
fHistDbg)[kProj])->SetBinContent(iBin,sigmIn/(xMax-xMin));
756 ((
TH1D *)(*
fHistDbg)[kProj])->SetBinContent(iBin,sigmOut/(1-xMax+xMin));
764 if(iLo == 0) xBest=yBest;
765 if(iUp ==
fNBin) yBest=xBest;
771 if( (kBest >= fDim) || (kBest<0) )
Error(
"Varedu",
"Something wrong with kBest - kBest = %d dim = %d\n",kBest,fDim);
783 Double_t carve,carvTot,carvMax,carvOne,binMax,binTot;
784 Int_t jLow,jUp,iLow,iUp;
790 if(bins==0)
Error(
"Carver",
"Cannot initialize buffer Bins \n" );
797 for(kProj=0; kProj<
fDim; kProj++)
803 for(iBin=0; iBin<
fNBin;iBin++){
804 bins[iBin]= ((
TH1D *)(*
fHistEdg)[kProj])->GetBinContent(iBin+1);
813 for(iBin=0;iBin<
fNBin;iBin++){
814 carvTot = carvTot + (binMax-bins[iBin]);
823 for(iBin=0; iBin<
fNBin;iBin++) {
827 for(j=iBin; j>-1; j-- ) {
828 if(theBin< bins[j])
break;
835 for(j=iBin; j<
fNBin; j++) {
836 if(theBin< bins[j])
break;
842 carve = (iUp-iLow+1)*(binMax-theBin);
843 if( carve > carvOne) {
850 if( carvTot > carvMax) {
857 if(jLow == 0 ) xBest = yBest;
858 if(jUp == fNBin-1) yBest = xBest;
865 for(iBin=0; iBin<
fNBin; iBin++)
866 ((
TH1D *)(*fHistDbg)[kProj])->SetBinContent(iBin+1,binMax);
867 for(iBin=jLow; iBin<jUp+1; iBin++)
868 ((
TH1D *)(*fHistDbg)[kProj])->SetBinContent(iBin+1,yLevel);
870 if( (kBest >= fDim) || (kBest<0) )
Error(
"Carver",
"Something wrong with kBest - kBest = %d dim = %d\n",kBest,fDim);
900 if( (iCell<0) || (iCell>
fLastCe) )
Error(
"Grow",
"Wrong iCell \n");
909 std::cout<<
fDim<<std::flush;
911 std::cout<<
"."<<std::flush;
912 if( (
fLastCe%(100*kEcho))==0) std::cout<<
"|"<<
fLastCe<<std::endl<<std::flush;
916 if(
Divide( newCell )==0)
break;
919 std::cout<<std::endl<<std::flush;
936 if(
fCells[i]->GetStat() == 1 ) {
947 std::cout <<
"STOP in TFoam::PeekMax: not found iCell=" << iCell << std::endl;
971 if( kBest<0 || kBest>=
fDim )
Error(
"Divide",
"Wrong kBest \n");
1008 for(iCell=0; iCell<=
fLastCe; iCell++) {
1009 if (
fCells[iCell]->GetStat()==1) {
1016 if(
fNoAct != n)
Error(
"MakeActiveList",
"Wrong fNoAct \n" );
1017 if(
fPrime == 0.)
Error(
"MakeActiveList",
"Integrand function is zero \n" );
1023 for(iCell=0; iCell<
fNoAct; iCell++) {
1039 Info(
"ResetPseRan",
"Resetting random number generator \n");
1053 Error(
"SetRho",
"Bad function \n" );
1064 if (
fRho && dynamic_cast<FoamIntegrandFunction*>(
fRho) )
delete fRho;
1065 fRho=
new FoamIntegrandFunction(fun);
1067 Error(
"SetRho",
"Bad function \n" );
1081 Info(
"ResetRho",
"!!! Resetting distribution function !!!\n");
1116 paramArr[1]=(
Long_t)xRand;
1141 hit = lo + (
Int_t)( (hi-lo)*(random-flo)/(fhi-flo)+0.5);
1182 rCell->
GetHcub(cellPosi,cellSize);
1183 for(j=0; j<
fDim; j++)
1263 mcError = mcResult *mCerelat;
1308 Double_t mCerelat= mcError/mcResult;
1312 Double_t mCeff, mcEf2, wtMax, aveWt, sigma;
1315 if(wtMax>0.0) mCeff=aveWt/wtMax;
1316 mcEf2 = sigma/aveWt;
1320 BXTXT(
"****************************************");
1321 BXTXT(
"****** TFoam::Finalize ******");
1322 BXTXT(
"****************************************");
1323 BX1I(
" NevGen",
fNevGen,
"Number of generated events in the MC generation ");
1324 BX1I(
" nCalls",
fNCalls,
"Total number of function calls ");
1325 BXTXT(
"----------------------------------------");
1326 BX1F(
" AveWt",aveWt,
"Average MC weight ");
1327 BX1F(
" WtMin",
fWtMin,
"Minimum MC weight (absolute) ");
1328 BX1F(
" WtMax",
fWtMax,
"Maximum MC weight (absolute) ");
1329 BXTXT(
"----------------------------------------");
1330 BX1F(
" XPrime",
fPrime,
"Primary total integral, R_prime ");
1331 BX1F(
" XDiver",driver,
"Driver total integral, R_loss ");
1332 BXTXT(
"----------------------------------------");
1333 BX2F(
" IntMC", mcResult, mcError,
"Result of the MC Integral");
1334 BX1F(
" mCerelat", mCerelat,
"Relative error of the MC integral ");
1335 BX1F(
" <w>/WtMax",mCeff,
"MC efficiency, acceptance rate");
1336 BX1F(
" Sigma/<w>",mcEf2,
"MC efficiency, variance/ave_wt");
1337 BX1F(
" WtMax",wtMax,
"WtMax(esp= 0.0005) ");
1338 BX1F(
" Sigma",sigma,
"variance of MC weight ");
1341 BX1F(
"<OveW>/<W>",avOve,
"Contrib. of events wt>MaxWtRej");
1357 if(
fDim==0)
Error(
"TFoam",
"SetInhiDiv: fDim=0 \n");
1363 if( ( 0<=iDim) && (iDim<
fDim)) {
1366 Error(
"SetInhiDiv:",
"Wrong iDim \n");
1383 if(
fDim<=0)
Error(
"SetXdivPRD",
"fDim=0 \n");
1384 if( len<1 )
Error(
"SetXdivPRD",
"len<1 \n");
1391 if( ( 0<=iDim) && (iDim<
fDim)) {
1394 Error(
"SetXdivPRD",
"Second allocation of XdivPRD not allowed \n");
1396 for(i=0; i<len; i++) {
1400 Error(
"SetXdivPRD",
"Wrong iDim \n");
1403 std::cout<<
" SetXdivPRD, idim= "<<iDim<<
" len= "<<len<<
" "<<std::endl;
1404 for(i=0; i<len; i++) {
1405 if (iDim <
fDim) std::cout<< (*
fXdivPRD[iDim])[i] <<
" ";
1407 std::cout<<std::endl;
1408 for(i=0; i<len; i++) std::cout<< xDiv[i] <<
" ";
1409 std::cout<<std::endl;
1421 Int_t errors, warnings;
1425 errors = 0; warnings = 0;
1426 if (level==1) std::cout <<
"///////////////////////////// FOAM_Checks /////////////////////////////////" << std::endl;
1427 for(iCell=1; iCell<=
fLastCe; iCell++) {
1433 if (level==1)
Error(
"CheckAll",
"ERROR: Cell's no %ld has only one daughter \n",iCell);
1437 if (level==1)
Error(
"CheckAll",
"ERROR: Cell's no %ld has no daughter and is inactive \n",iCell);
1441 if (level==1)
Error(
"CheckAll",
"ERROR: Cell's no %ld has two daughters and is active \n",iCell);
1448 if (level==1)
Error(
"CheckAll",
"ERROR: Cell's no %ld parent not pointing to this cell\n ",iCell);
1454 if(cell != (cell->
GetDau0())->GetPare()) {
1456 if (level==1)
Error(
"CheckAll",
"ERROR: Cell's no %ld daughter 0 not pointing to this cell \n",iCell);
1460 if(cell != (cell->
GetDau1())->GetPare()) {
1462 if (level==1)
Error(
"CheckAll",
"ERROR: Cell's no %ld daughter 1 not pointing to this cell \n",iCell);
1468 for(iCell=0; iCell<=
fLastCe; iCell++) {
1472 if(level==1)
Warning(
"CheckAll",
"Warning: Cell no. %ld is active but empty \n", iCell);
1477 Info(
"CheckAll",
"Check has found %d errors and %d warnings \n",errors, warnings);
1480 Info(
"CheckAll",
"Check - found total %d errors \n",errors);
1491 for(iCell=0; iCell<=
fLastCe; iCell++) {
1492 std::cout<<
"Cell["<<iCell<<
"]={ ";
1494 std::cout<<std::endl;
1496 std::cout<<
"}"<<std::endl;
1506 std::ofstream outfile(filename, std::ios::out);
1511 outfile<<
"{" << std::endl;
1512 outfile<<
"cMap = new TCanvas(\"Map1\",\" Cell Map \",600,600);"<<std::endl;
1514 outfile<<
"TBox*a=new TBox();"<<std::endl;
1515 outfile<<
"a->SetFillStyle(0);"<<std::endl;
1516 outfile<<
"a->SetLineWidth(4);"<<std::endl;
1517 outfile<<
"a->SetLineColor(2);"<<std::endl;
1518 outfile<<
"a->DrawBox("<<offs<<
","<<offs<<
","<<(offs+lpag)<<
","<<(offs+lpag)<<
");"<<std::endl;
1520 outfile<<
"TText*t=new TText();"<<std::endl;
1521 outfile<<
"t->SetTextColor(4);"<<std::endl;
1523 outfile<<
"t->SetTextSize(0.025);"<<std::endl;
1525 outfile<<
"t->SetTextSize(0.015);"<<std::endl;
1527 outfile<<
"t->SetTextSize(0.008);"<<std::endl;
1529 outfile<<
"TBox*b=new TBox();"<<std::endl;
1530 outfile <<
"b->SetFillStyle(0);"<<std::endl;
1534 outfile <<
"// =========== Rectangular cells ==========="<< std::endl;
1535 for(iCell=1; iCell<=
fLastCe; iCell++) {
1536 if(
fCells[iCell]->GetStat() == 1) {
1538 x1 = offs+lpag*( cellPosi[0]); y1 = offs+lpag*( cellPosi[1]);
1539 x2 = offs+lpag*(cellPosi[0]+cellSize[0]); y2 = offs+lpag*(cellPosi[1]+cellSize[1]);
1542 outfile<<
"b->DrawBox("<<x1<<
","<<y1<<
","<<x2<<
","<<y2<<
");"<<std::endl;
1545 x = offs+lpag*(cellPosi[0]+0.5*cellSize[0]); y = offs+lpag*(cellPosi[1]+0.5*cellSize[1]);
1546 outfile<<
"t->DrawText("<<x<<
","<<y<<
","<<
"\""<<iCell<<
"\""<<
");"<<std::endl;
1550 outfile<<
"// ============== End Rectangles ==========="<< std::endl;
1554 outfile <<
"}" << std::endl;
1562 Info(
"LinkCells",
"VOID function for backward compatibility \n");
Int_t fNoAct
Lists of division values encoded in one vector per direction.
virtual void CheckAll(Int_t)
User utility, miscellaneous and debug.
virtual void RootPlot2dim(Char_t *)
Debugging tool which plots 2-dimensional cells as rectangles in C++ format readable for root...
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
#define BX2F(name, numb, err, text)
virtual void LinkCells(void)
virtual Double_t Rndm(Int_t i=0)
Machine independent random number generator.
virtual Long_t PeekMax()
Internal subprogram used by Initialize.
virtual void Delete(Option_t *option="")
Remove all objects from the array AND delete all heap based objects.
virtual void GetWtParams(Double_t, Double_t &, Double_t &, Double_t &)
May be called optionally after the MC run.
Int_t fOptPRD
[fDim] Flags for inhibiting cell division
void SetDau1(TFoamCell *Daug)
virtual void RndmArray(Int_t n, Float_t *array)
Return an array of n random numbers uniformly distributed in ]0,1].
virtual void Varedu(Double_t [], Int_t &, Double_t &, Double_t &)
Internal subrogram used by Initialize.
virtual Double_t MCgenerate(Double_t *MCvect)
User subprogram which generates MC event and returns MC weight.
static const char * filename()
static Bool_t AddDirectoryStatus()
static function: cannot be inlined on Windows/NT
void Print(Option_t *option) const
Printout of the cell geometry parameters for the debug purpose.
Short_t Min(Short_t a, Short_t b)
virtual void MakeEvent()
User subprogram.
TFoamCell * GetDau1() const
virtual ~TFoam()
Default destructor.
An array of references to TObjects.
void GetMCeff(Double_t, Double_t &, Double_t &)
Calculates Efficiency= aveWt/wtLim for a given tolerance level epsilon<<1 using information stored in...
virtual void GenerCel2(TFoamCell *&)
Internal subprogram.
virtual void MakeActiveList()
Internal subrogram used by Initialize.
virtual void Grow()
Internal subrogram used by Initialize.
static void AddDirectory(Bool_t add=kTRUE)
Sets the flag controlling the automatic add of histograms in memory.
virtual void SetXdivPRD(Int_t, Int_t, Double_t[])
This should be called before Initialize, after setting kDim It predefines values of the cell division...
void SetParamPtrs(void *paramArr, Int_t nparam=-1)
ParamArr is an array containing the function argument values.
virtual Double_t GetMCwt()
User may get weight MC weight using this method.
static const double x2[5]
virtual void ResetRho(TFoamIntegrand *Rho)
User may optionally reset the distribution using this method Usually it is done when FOAM object is r...
TMethodCall * fMethodCall
Pointer to the user-defined integrand function/distribution.
This is the base class for the ROOT Random number generators.
virtual void PrintCells()
Prints geometry of ALL cells of the FOAM.
TObject * At(Int_t idx) const
#define BX1I(name, numb, text)
Double_t Sqr(Double_t x) const
Method or function calling interface.
virtual void Reset(Option_t *option="")
Reset.
void CalcVolume()
Calculates volume of the cell using size params which are calculated.
TFoamCell * GetDau0() const
virtual void Finalize(Double_t &, Double_t &)
May be called optionally by the user after the MC run.
void SetXdiv(Double_t Xdiv)
virtual void MakeAlpha()
Internal subrogram used by Initialize.
void SetDriv(Double_t Driv)
virtual void GetMCvect(Double_t *)
User may get generated MC point/vector with help of this method.
virtual void SetInhiDiv(Int_t, Int_t)
This can be called before Initialize, after setting kDim It defines which variables are excluded in t...
virtual Double_t Density(Int_t ndim, Double_t *)=0
void SetIntg(Double_t Intg)
Double_t GetVolume() const
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Initialize()
Basic initialization of FOAM invoked by the user.
virtual void SetRhoInt(void *Rho)
User may use this to set pointer to the global function (not descending from TFoamIntegrand) serving ...
TFoamCell * GetPare() const
1-D histogram with a double per channel (see TH1 documentation)}
static const Double_t gVlow
void InitWithPrototype(TClass *cl, const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch)
Initialize the method invocation environment.
void Fill(Int_t, TFoamCell *, TFoamCell *, TFoamCell *)
Fills in certain data into newly allocated cell.
virtual void Carver(Int_t &, Double_t &, Double_t &)
Internal subrogram used by Initialize.
static const double x1[5]
virtual const char * Getp2f2funcname(void *) const
void GetHcub(TFoamVect &, TFoamVect &) const
Provides size and position of the cell These parameter are calculated by analyzing information in all...
double func(double *x, double *p)
virtual void SetPseRan(TRandom *PseRan)
virtual void InitCells()
Internal subprogram used by Initialize.
void SetSerial(Int_t Serial)
Mother of all ROOT objects.
virtual Int_t CellFill(Int_t, TFoamCell *)
Internal subprogram used by Initialize.
virtual void GetIntNorm(Double_t &, Double_t &)
User subprogram.
virtual void Explore(TFoamCell *Cell)
Internal subprogram used by Initialize.
void Execute(const char *, const char *, int *=0)
Execute method on this object with the given parameter string, e.g.
Short_t Max(Short_t a, Short_t b)
void SetPrim(Double_t Prim)
virtual void ResetPseRan(TRandom *PseRan)
User may optionally reset random number generator using this method Usually it is done when FOAM obje...
void Fill(Double_t)
Filling analyzed weight.
#define BX1F(name, numb, text)
float type_of_call hi(const int &, const int &)
virtual Double_t Eval(Double_t *)
Internal subprogram.
virtual Int_t Divide(TFoamCell *)
Internal subrogram used by Initialize.
static const Double_t gHigh
R__EXTERN TInterpreter * gCling
Int_t * fInhiDiv
[fDim] Dynamic Mask for cell division
void SetDau0(TFoamCell *Daug)
virtual void SetRho(TFoamIntegrand *Rho)
User may use this method to set the distribution object.
virtual void GetIntegMC(Double_t &, Double_t &)
User subprogram.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
const char * Data() const
TFoam()
Default constructor for streamer, user should not use it.
TRandom * fPseRan
ROOT's pointer to user-defined global distribution function.