Example #1
0
Int_t foam_demopers()
{

  gSystem->Load("libFoam");

  // need to load the foam_demo tutorial for the definition of the function
  TString macroName = gSystem->UnixPathName(__FILE__);
  macroName.ReplaceAll("foam_demopers.C","foam_demo.C");
  gROOT->ProcessLine(TString::Format(".L %s+",macroName.Data()));

  //******************************************
  cout<<"====================== TestVector ================================"<<endl;
  TFile fileA("foam_demo.root");
  fileA.cd();
  cout<<"------------------------------------------------------------------"<<endl;
  fileA.ls();
  cout<<"------------------------------------------------------------------"<<endl;
  fileA.Map();
  cout<<"------------------------------------------------------------------"<<endl;
  fileA.ShowStreamerInfo();
  cout<<"------------------------------------------------------------------"<<endl;
  fileA.GetListOfKeys()->Print();
  cout<<"------------------------------------------------------------------"<<endl;
  //*******************************************
  TFoam  *FoamX = (TFoam*)fileA.Get("FoamX");
  //*******************************************
//  FoamX->PrintCells();
  FoamX->CheckAll(1);

 //N.B. the integrand functions need to be reset
 // because cannot be made persistent
#ifdef __CINT__
 // this can be done only in CINT
 TFoamIntegrand    *rho= new TFDISTR();
#else
   // this should be done with AClic or Cling
   TFoamIntegrand * rho = (TFoamIntegrand*) gROOT->ProcessLine("return new TFDISTR();");
#endif
 FoamX->SetRho(rho);

 Double_t *MCvect =new Double_t[2]; // 2-dim vector generated in the MC run

 for(long loop=0; loop<50000; loop++){
    FoamX->MakeEvent();            // generate MC event
    FoamX->GetMCvect( MCvect);     // get generated vector (x,y)
    Double_t x=MCvect[0];
    Double_t y=MCvect[1];
    if(loop<10) cout<<"(x,y) =  ( "<< x <<", "<< y <<" )"<<endl;
    }// loop
  //
  Double_t IntNorm, Errel;
  FoamX->Finalize(   IntNorm, Errel);     // final printout
  Double_t MCresult, MCerror;
  FoamX->GetIntegMC( MCresult, MCerror);  // get MC integral, should be one
  cout << " MCresult= " << MCresult << " +- " << MCerror <<endl;
  cout<<"===================== TestPers FINISHED ======================="<<endl;
  return 0;
}
Example #2
0
void Foam::Init()
{
	//Retrieve the maxima and minima, to use in the coordinate transforms
	for (unsigned int continuousIndex = 0; continuousIndex < continuousNames.size(); ++continuousIndex )
	{
		double maximum = generationBoundary->GetConstraint( *continuousNames_ref[continuousIndex] )->GetMaximum();
		double minimum = generationBoundary->GetConstraint( *continuousNames_ref[continuousIndex] )->GetMinimum();
		minima.push_back(minimum);
		ranges.push_back( maximum - minimum );
	}

	double rand = rootRandom->Rndm();

	//Make a Foam generator for each combination
	for( unsigned int combinationIndex = 0; combinationIndex < discreteCombinations.size(); ++combinationIndex )
	{
		//Make the data point for the combination
		DataPoint * init_temporaryDataPoint = new DataPoint(allNames);
		for( unsigned int discreteIndex = 0; discreteIndex < discreteNames.size(); ++discreteIndex )
		{
			IConstraint* thisConst=NULL;
			try
			{
				thisConst=generationBoundary->GetConstraint( *discreteNames_ref[discreteIndex] );
			}
			catch(...)
			{
				cout << endl;
				exit(52);
			}
			string unit = thisConst->GetUnit();
			init_temporaryDataPoint->SetObservable( discreteNames[discreteIndex], discreteCombinations[combinationIndex][discreteIndex], unit );
		}
		for (unsigned int continuousIndex = 0; continuousIndex < continuousNames.size(); ++continuousIndex )
		{
			IConstraint* thisConst=NULL;
			try
			{
				thisConst=generationBoundary->GetConstraint( *continuousNames_ref[continuousIndex] );
			}
			catch(...)
			{
				cout << endl;
				exit(53);
			}
			string unit = thisConst->GetUnit();
			init_temporaryDataPoint->SetObservable( continuousNames[continuousIndex], 0.0, unit );
		}

		//init_temporaryDataPoint->Print();
		//Make the function wrapper
		IntegratorFunction* combinationFunction = new IntegratorFunction( InputPDF, init_temporaryDataPoint, continuousNames, discreteNames, minima, ranges, generationBoundary );

		//cout << InputPDF->GET_ID() << endl;
		//if( InputPDF->GetCacheStatus() )	cout << "HAS CACHED FOAM" << endl;
		//else	cout << "HAS NOT CACHED FOAM" << endl;

		TFile* MC_Cache = NULL;
		TFoam * foamGenerator = NULL;

		if( !InputPDF->GetMCCacheStatus() )
		{
			//      Generate unique name for this foam instance
			TString Name("Foam-");
			Name.Append(InputPDF->GetLabel());
			Name.Append("-");
			Name+=combinationIndex;
			Name.Append("_");Name+=rand;
			string CleanName=Name.Data(); replace( CleanName.begin(), CleanName.end(), '.', '_' ); Name=CleanName.c_str();
			TString FoamName("Foam_");FoamName+=combinationIndex;
			//      Create a root file to store the TFoam universe
			TString RootName(Name);
			RootName.Append(".root");

			cout << "FOAM NOT Cached, Generating Foam:\t" << Name << endl;
			MC_Cache = new TFile( RootName, "RECREATE" );
			MC_Cache->Write( "", TObject::kOverwrite );
			/*
			if( debug != NULL )
			{
				if( debug->DebugThisClass("Foam") )
				{
					cout << "File Created" << endl;
				}
			}
			*/
			//Initialise Foam
			foamGenerator = new TFoam( Name );
			foamGenerator->SetkDim( Int_t(continuousNames.size()) );
			foamGenerator->SetPseRan( rootRandom );
			foamGenerator->SetRho( combinationFunction );	//	Can afford to Boot Foam's ability if we're using just one cached instance :D
			foamGenerator->SetnCells( 1000 );	//	1000	Total number of bins to construct
			foamGenerator->SetnSampl( 200 );	//	200	Samples to take when constructing bins
			foamGenerator->SetnBin( 8 );		//	8	Bins along each axis
			foamGenerator->SetOptRej( 1 );		//	1/0	Don't/Use Weighted Distribution
			foamGenerator->SetOptDrive( 2 );	//	1/2	Best Varience/Weights
			foamGenerator->SetEvPerBin( 25 );	//	25	Weights per bin... This doesn't Saturate as object is written before generating events
			foamGenerator->SetChat( 0 );		//	0	verbosity
			foamGenerator->SetMaxWtRej( 1.1 );	//	1.1	Unknown what effect this has, something to do with weights
			/*
			if( debug != NULL )
			{
				if( debug->DebugThisClass("Foam") )
				{
					cout << "Initializing Foam" << endl;
				}
			}
			*/
			foamGenerator->Initialize();
			//			foamGenerator->ResetPseRan( rootRandom );
			//			foamGenerator->ResetRho( combinationFunction );	//	Can afford to Boot Foam's ability if we're using just one cached instance :D
			//			foamGenerator->Initialize();
			//	As we haven't cached yet, write to file
			foamGenerator->Write( Name, TObject::kOverwrite );
			cout << "Storing TFOAM TObject in:\t\t" << RootName << endl;
			/*
			if( debug != NULL )
			{
				if( debug->DebugThisClass("Foam") )
				{
					cout << "Adding Cache" << endl;
				}
			}
			*/
			InputPDF->AddCacheObject( Name.Data() );
			MC_Cache->Write( "", TObject::kOverwrite );
			InputPDF->Can_Remove_Cache( true );
			//MC_Cache->Close();
		}
		else
		{
			TString Name = InputPDF->GetMCCacheNames()[combinationIndex];
			TString RootName(Name); RootName.Append(".root");
			TString FoamName("Foam_");FoamName+=combinationIndex;
			rootRandom = RapidFitRandom::GetRandomFunction();
			cout << "FOAM Cached, Re-Aquiring TFOAM TObject:\t" << Name << endl;

			ifstream input_file;
			input_file.open( RootName.Data(), ifstream::in );
			input_file.close();
			bool access_fail = input_file.fail();

			if( access_fail )
			{
				cout << "\nWe have Failed to re-aquire the TFoam File, Regenerating one for the Fit\n" << endl;
				InputPDF->Remove_Cache();

				//      Generate unique name for this foam instance
				Name="Foam-";
				Name.Append(InputPDF->GetLabel());
				Name.Append("-");
				Name+=combinationIndex;
				Name.Append("_");Name+=rand;
				string CleanName=Name.Data(); replace( CleanName.begin(), CleanName.end(), '.', '_' ); Name=CleanName.c_str();
				FoamName="Foam_";FoamName+=combinationIndex;
				//      Create a root file to store the TFoam universe
				RootName=Name;
				RootName.Append(".root");

				cout << "FOAM NOT Cached, Generating Foam:\t" << Name << endl;
				MC_Cache = new TFile( RootName, "RECREATE" );
				MC_Cache->Write( "", TObject::kOverwrite );
				//Initialise Foam
				foamGenerator = new TFoam( Name );
				foamGenerator->SetkDim( Int_t(continuousNames.size()) );
				foamGenerator->SetPseRan( rootRandom );
				foamGenerator->SetRho( combinationFunction );   //      Can afford to Boot Foam's ability if we're using just one cached instance :D
				foamGenerator->SetnCells( 1000 );       //      1000    Total number of bins to construct
				foamGenerator->SetnSampl( 200 );        //      200     Samples to take when constructing bins
				foamGenerator->SetnBin( 8 );            //      8       Bins along each axis
				foamGenerator->SetOptRej( 1 );          //      1/0     Don't/Use Weighted Distribution
				foamGenerator->SetOptDrive( 2 );        //      1/2     Best Varience/Weights
				foamGenerator->SetEvPerBin( 25 );       //      25      Weights per bin... This doesn't Saturate as object is written before generating events
				foamGenerator->SetChat( 0 );            //      0       verbosity
				foamGenerator->SetMaxWtRej( 1.1 );      //      1.1     Unknown what effect this has, something to do with weights
				foamGenerator->Initialize();
				//                      foamGenerator->ResetPseRan( rootRandom );
				//                      foamGenerator->ResetRho( combinationFunction ); //      Can afford to Boot Foam's ability if we're using just one cached instance :D
				//                      foamGenerator->Initialize();
				//      As we haven't cached yet, write to file
				//MC_Cache->Write( "", TObject::kOverwrite );
				foamGenerator->Write( Name, TObject::kOverwrite );
				cout << "Storing TFOAM TObject in:\t\t" << RootName << endl;
				InputPDF->AddCacheObject( Name.Data() );
				MC_Cache->Write( "", TObject::kOverwrite );
				InputPDF->Can_Remove_Cache( true );
			}
			else
			{
				MC_Cache = new TFile( RootName, "READ" );
				//gDirectory->ls();
				//Cached_Files.back()->Map();
				//Cached_Files.back()->ShowStreamerInfo();
				//Cached_Files.back()->GetListOfKeys()->Print();
				foamGenerator = (TFoam*) MC_Cache->Get( Name );
				//	This code has been production testeted enough such that I think this is pointlessly scaring users
				//cout << "Checking Consistancy, will crash if this fails... this is unavoidable" << endl;
				//cout << MC_Cache << endl;
				//cout << foamGenerator << endl;
				if( MC_Cache == NULL || foamGenerator == NULL )
				{
					cerr << "Error re-aquiring TFOAM object. This is unrecoverable" << endl;
					cout << "Error re-aquiring TFOAM object. This is unrecoverable" << endl;
					exit(-6542);
				}
				foamGenerator->ResetPseRan( rootRandom );
				foamGenerator->ResetRho( combinationFunction );
                                foamGenerator->SetnCells( 1000 );       //      1000    Total number of bins to construct
                                foamGenerator->SetnSampl( 200 );        //      200     Samples to take when constructing bins
                                foamGenerator->SetnBin( 8 );            //      8       Bins along each axis
                                foamGenerator->SetOptRej( 1 );          //      1/0     Don't/Use Weighted Distribution
                                foamGenerator->SetOptDrive( 2 );        //      1/2     Best Varience/Weights
                                foamGenerator->SetEvPerBin( 25 );       //      25      Weights per bin... This doesn't Saturate as object is written before generating events
                                foamGenerator->SetChat( 0 );            //      0       verbosity
                                foamGenerator->SetMaxWtRej( 1.1 );      //      1.1     Unknown what effect this has, something to do with weights
				foamGenerator->CheckAll(0);
				//	Make one event here to check everything was processed correctly
				foamGenerator->MakeEvent();
				cout << "Check OK" << endl;
			}
		}

		Open_Files.push_back( MC_Cache );
		//Debug
		//char filename[100];
		//sprintf( filename, "DebugFoamPlot.%d.c", combinationIndex );
		//foamGenerator->RootPlot2dim(filename);
		//foamGenerator->PrintCells();

		//Store the foam generator
		foamGenerators.push_back( foamGenerator );
		storedIntegrator.push_back( combinationFunction );
		delete init_temporaryDataPoint;
	}

	InputPDF->SetMCCacheStatus( true );
}