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; }
Int_t foam_kanwa(){ cout<<"--- kanwa started ---"<<endl; TH2D *hst_xy = new TH2D("hst_xy" , "x-y plot", 50,0,1.0, 50,0,1.0); Double_t *MCvect =new Double_t[2]; // 2-dim vector generated in the MC run // TRandom *PseRan = new TRandom3(); // Create random number generator PseRan->SetSeed(4357); TFoam *FoamX = new TFoam("FoamX"); // Create Simulator FoamX->SetkDim(2); // No. of dimensions, obligatory! FoamX->SetnCells(500); // Optionally No. of cells, default=2000 FoamX->SetRhoInt(Camel2); // Set 2-dim distribution, included below FoamX->SetPseRan(PseRan); // Set random number generator FoamX->Initialize(); // Initialize simulator, may take time... // // visualising generated distribution TCanvas *cKanwa = new TCanvas("cKanwa","Canvas for plotting",600,600); cKanwa->cd(); // From now on FoamX is ready to generate events int nshow=5000; for(long loop=0; loop<100000; 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; hst_xy->Fill(x,y); // live plot if(loop == nshow){ nshow += 5000; hst_xy->Draw("lego2"); cKanwa->Update(); } }// loop // hst_xy->Draw("lego2"); // final plot cKanwa->Update(); // Double_t MCresult, MCerror; FoamX->GetIntegMC( MCresult, MCerror); // get MC integral, should be one cout << " MCresult= " << MCresult << " +- " << MCerror <<endl; cout<<"--- kanwa ended ---"<<endl; return 0; }//kanwa