00001
00002
00003
00004
00005
00006 #include <sys/stat.h>
00007 #include <stdlib.h>
00008 #include <errno.h>
00009 #include <iostream>
00010 #include <sstream>
00011 #include <fstream>
00012 #include <iomanip>
00013 #include <stdexcept>
00014 #include "TROOT.h"
00015 #include "TH2.h"
00016 #include "TFile.h"
00017 #include "TRandom3.h"
00018 #include "TTree.h"
00019 #include "TStopwatch.h"
00020 #if (defined(__ICC) || defined(__ICL) || defined(__ECC) || defined(__ECL))
00021 # include <mathimf.h>
00022 #endif
00023
00024 #include "TRadCor.h"
00025 #include "TEPCrossPart.h"
00026 #include "TMuCrossPart.h"
00027 #include "TPiCrossPart.h"
00028 #include "TKnCrossPart.h"
00029 #include "TKcCrossPart.h"
00030 #include "TGGCrossPart.h"
00031 #include "TRadGlobal.h"
00032 #include "TKinemCut.h"
00033
00034 using namespace std;
00035
00036 typedef struct {
00037 Float_t Tptot[3];
00038 Float_t Tth[3];
00039 Float_t Tphi[3];
00040 Float_t Tptott[3];
00041 Float_t Ttht[3];
00042 Float_t Tphit[3];
00043 Float_t Vz;
00044 Int_t Type;
00045 } EVENT;
00046
00047
00048 Double_t mass[] = {
00049 M_ME,
00050 M_MMU,
00051 M_MPI,
00052 M_MKC,
00053 M_MK0,
00054 M_MTAU
00055 };
00056
00057 char *proc_name[] = {
00058 "ee",
00059 "mm",
00060 "pp",
00061 "kc",
00062 "kn",
00063 "tt",
00064 "gg"
00065 };
00066
00067 TRadCor *gRad;
00068 TRadGlobal *gGlobal;
00069 TKinemCut *gCut;
00070 TConstants *gConst;
00071 TStopwatch *timer;
00072
00073 Double_t EBeam;
00074 Int_t NSim, NRad;
00075 Int_t IsTuple, IsSmear, IsBrem, IsHardPhoton, IsNoVacPol, IsVerbose, IsFSR, IsAngleHist, IsDTSmear;
00076 string fname, RandomFileName;
00077 double smear_par[9];
00078 int type;
00079 int GetOption(unsigned int, char**);
00080 void hist_sample(Int_t i=0);
00081 void hist_sample_angle(Int_t i=0);
00082 void hist_sample_comp();
00083 const int MaxList = 22;
00084 bool InList[MaxList];
00085 TH1D *gH[MaxList], *gH2[MaxList];
00086
00087 int main(int argc, char **argv){
00088 int proc;
00089 timer = new TStopwatch();
00090 timer->Start(kFALSE);
00091
00092 gConst = new TConstants();
00093 gGlobal = new TRadGlobal();
00094 gCut = new TKinemCut();
00095
00096 try{
00097 proc = GetOption(argc, argv);
00098 }catch(std::logic_error lge){
00099 cout<<lge.what()<<endl;
00100 return 1;
00101 }
00102
00103 if(gRandom) delete gRandom;
00104 gRandom = new TRandom3();
00105 struct stat stbuf;
00106 if( stat(RandomFileName.c_str(),&stbuf) == 0 ){
00107 cout<<"Reading random seed from file \""<<RandomFileName<<"\"."<<endl;
00108 TFile *frndm = new TFile(RandomFileName.c_str(),"read");
00109 frndm->ReadTObject(gRandom,gRandom->GetName());
00110 delete frndm;
00111
00112 } else {
00113 cout<<strerror(errno)<<endl;
00114 }
00115
00116 TVCrossPart *MatrixElements;
00117 if(proc==0)
00118 MatrixElements = new TEPCrossPart();
00119 else if(proc==1 || proc==5)
00120 MatrixElements = new TMuCrossPart();
00121 else if(proc==2)
00122 MatrixElements = new TPiCrossPart();
00123 else if(proc==3)
00124 MatrixElements = new TKnCrossPart();
00125 else if(proc==4)
00126 MatrixElements = new TKcCrossPart();
00127 else if(proc==6)
00128 MatrixElements = new TGGCrossPart();
00129 else
00130 return 1;
00131
00132 if(IsNoVacPol)
00133 MatrixElements->SetZeroVP();
00134
00135 if(!IsFSR)
00136 MatrixElements->SetNoFSR();
00137
00138 gRad = new TRadCor(MatrixElements);
00139 gRad->SetNEvents(NRad);
00140 gRad->SetPartList(InList);
00141 gRad->Init();
00142
00143 MatrixElements->SetHardPhoton(IsHardPhoton);
00144 if(IsDTSmear){
00145 gRad->SetSmear(true);
00146 MatrixElements->GetEvent()->SetdPar(smear_par);
00147 }
00148
00149 #ifdef HIST
00150 TFile *f = NULL;
00151 if(fname == "") return -1;
00152 cout<<"Try to open output file."<<endl<<flush;
00153 cout<<fname<<endl<<flush;
00154 f = new TFile(fname.c_str(),"RECREATE");
00155
00156 int nelem = MatrixElements->GetNPart();
00157 for(int i=0;i<nelem+1;i++)
00158 if(InList[i]||i==nelem){
00159 ostringstream hname;
00160 hname.str(""); hname<<"dth_"<<i;
00161 gH[i] = new TH1D(hname.str().c_str(),"#Delta#theta",34*5,0,34*0.03);
00162 gH[i]->Sumw2();
00163 hname.str(""); hname<<"dth2_"<<i;
00164 gH2[i] = new TH1D(hname.str().c_str(),"#Delta#theta",34*5,0,34*0.03);
00165 gH2[i]->Sumw2();
00166 }
00167 #endif
00168 gRad->MakeCrossSection();
00169 #ifdef HIST
00170 for(int i=0;i<nelem;i++)
00171 if(InList[i]){
00172 gH[nelem]->Add(gH[i],1./gRad->GetWN(i));
00173 gH2[nelem]->Add(gH2[i],gRad->GetMax(i)/gRad->GetN(i));
00174 }
00175
00176 cout<<"Histogram has been sampled!"<<timer->RealTime()<<endl<<flush;
00177 f->Write();
00178 delete f;
00179 cout<<"File has been closed!"<<timer->RealTime()<<endl<<flush;
00180 #endif
00181 if(proc==2)((TPiCrossPart*)MatrixElements)->GetFormFactor()->Print();
00182 cout<<"Born Cross Section is "<<2*M_PI*gGlobal->Get_Norm()*MatrixElements->BornCrossSection(gCut->AverageThetaMin())<<" nb"<<endl;
00183 if ( fname != "" && NSim > 0 ) {
00184
00185 if(IsAngleHist)
00186 hist_sample_angle(proc);
00187 else
00188 hist_sample(proc);
00189 }
00190
00191 delete MatrixElements;
00192 delete gRad;
00193 delete gCut;
00194 delete gGlobal;
00195 if( stat(RandomFileName.c_str(),&stbuf) == 0 ){
00196 remove(RandomFileName.c_str());
00197 }
00198 cout<<"Writing random seed to file \""<<RandomFileName<<"\"."<<endl;
00199
00200 TFile *frndm = new TFile(RandomFileName.c_str(),"recreate");
00201 frndm->WriteTObject(gRandom,gRandom->GetName());
00202 delete frndm;
00203
00204 delete gRandom;
00205 delete timer;
00206
00207 return 0;
00208 }
00209
00210 int GetOption(unsigned int argc, char **argv){
00211 EBeam = 185.;
00212 NRad = 1000;
00213 NSim = 0;
00214 IsTuple = 0;
00215 IsSmear = 0;
00216 IsBrem = 0;
00217 IsHardPhoton = 1;
00218 IsNoVacPol = 0;
00219 IsVerbose = 0;
00220 IsFSR = 1;
00221 IsAngleHist = 0;
00222 IsDTSmear = 0;
00223 type = 0;
00224 fname = "";
00225 RandomFileName = ".random_stat.root";
00226 int proc = 0;
00227 double pc = 0.;
00228 double de = -1.;
00229 double nt0 = -1.;
00230 double dt = 0.25;
00231 double dp = 0.15;
00232 double at = 1.1;
00233 double td = -1.;
00234 double am = 90.;
00235 double cm = 90.;
00236 double em = 50.;
00237 double ti = 0.473;
00238 double al = 1.;
00239 double thm_min = -1.;
00240 double thp_min = -1.;
00241 double thm_max = -1.;
00242 double thp_max = -1.;
00243 double te = 0.1;
00244 double re = 0.1;
00245 for(int j = 0; j<18; j++) InList[j] = true;
00246 for(int j = 18; j<MaxList; j++) InList[j] = false;
00247
00248 for (unsigned int i = 1; i < argc; i++){
00249 if(strlen(argv[i])>1)
00250 if (!strcmp(argv[i], "-e")){
00251 EBeam = atof(argv[++i]);
00252
00253 }else if (!strcmp(argv[i], "-ns")){
00254 NSim = atoi(argv[++i]);
00255
00256 }else if (!strcmp(argv[i], "-type")){
00257 type = atoi(argv[++i]);
00258
00259 }else if (!strcmp(argv[i], "-v")){
00260 IsVerbose = 1;
00261
00262 }else if (!strcmp(argv[i], "-nr")){
00263 NRad = atoi(argv[++i]);
00264
00265 }else if (!strcmp(argv[i], "-de")){
00266 de = atof(argv[++i]);
00267
00268 }else if (!strcmp(argv[i], "-nt0")){
00269 nt0 = atof(argv[++i]);
00270
00271 }else if (!strcmp(argv[i], "-dt")){
00272 dt = atof(argv[++i]);
00273
00274 }else if (!strcmp(argv[i], "-tc")){
00275 at = atof(argv[++i]);
00276
00277 }else if (!strcmp(argv[i], "-dp")){
00278 dp = atof(argv[++i]);
00279
00280 }else if (!strcmp(argv[i], "-td")){
00281 td = atof(argv[++i]);
00282
00283 }else if (!strcmp(argv[i], "-ti")){
00284 ti = atof(argv[++i]);
00285
00286 }else if (!strcmp(argv[i], "-al")){
00287 al = atof(argv[++i]);
00288
00289 }else if (!strcmp(argv[i], "-am")){
00290 am = atof(argv[++i]);
00291
00292 }else if (!strcmp(argv[i], "-cm")){
00293 cm = atof(argv[++i]);
00294
00295 }else if (!strcmp(argv[i], "-em")){
00296 em = atof(argv[++i]);
00297
00298 }else if (!strcmp(argv[i], "-pc")){
00299 pc = atof(argv[++i]);
00300
00301 }else if (!strcmp(argv[i], "-thm")){
00302 thm_min = atof(argv[++i]);
00303 thm_max = atof(argv[++i]);
00304
00305 }else if (!strcmp(argv[i], "-thp")){
00306 thp_min = atof(argv[++i]);
00307 thp_max = atof(argv[++i]);
00308
00309 }else if (!strcmp(argv[i], "-p")){
00310 proc = atoi(argv[++i]);
00311
00312 }else if (!strcmp(argv[i], "-er")){
00313 te = atof(argv[++i]);
00314
00315 }else if (!strcmp(argv[i], "-rer")){
00316 re = atof(argv[++i]);
00317
00318 }else if (!strcmp(argv[i], "-tup")){
00319 IsTuple = 1;
00320
00321 }else if (!strcmp(argv[i], "-brem")){
00322 IsBrem = 1;
00323
00324 }else if (!strcmp(argv[i], "-fname")){
00325 fname = argv[++i];
00326
00327 }else if (!strcmp(argv[i], "-rname")){
00328 RandomFileName = argv[++i];
00329
00330 }else if (!strcmp(argv[i], "-hsm")){
00331 IsSmear = 1;
00332
00333 }else if (!strcmp(argv[i], "-ah")){
00334 IsAngleHist = 1;
00335
00336 }else if (!strcmp(argv[i], "-hp")){
00337 IsHardPhoton = 1;
00338
00339 }else if (!strcmp(argv[i], "-nhp")){
00340 IsHardPhoton = 0;
00341
00342 }else if (!strcmp(argv[i], "-nfsr")){
00343 IsFSR = 0;
00344
00345 }else if (!strcmp(argv[i], "-nvp")){
00346 IsNoVacPol = 1;
00347
00348 }else if (!strcmp(argv[i], "-exclude")){
00349 for(int j = 0; j<MaxList; j++) InList[j] = true;
00350 while((i+1 < argc) && bool(strncmp(argv[i+1],"-",1))){
00351 int j = atoi(argv[++i]);
00352 if( j<MaxList ) InList[j] = false;
00353 }
00354
00355 }else if (!strcmp(argv[i], "-include")){
00356 for(int j = 0; j<MaxList; j++) InList[j] = false;
00357 while((i+1 < argc) && bool(strncmp(argv[i+1],"-",1))){
00358 int j = atoi(argv[++i]);
00359 if( j<MaxList ) InList[j] = true;
00360 }
00361
00362 }else if (!strcmp(argv[i], "-asm")){
00363 IsDTSmear = 1;
00364 int k = 0;
00365 while((i+1 < argc) && bool(strncmp(argv[i+1],"-",1))){
00366 smear_par[k] = atof(argv[++i]);
00367 k++;
00368 }
00369 if ( k != 6 && k != 9 ) throw logic_error("Number of parameters for smearing must be 6 or 9!");
00370 if ( k<9 ) {
00371 smear_par[6] = 1.;
00372 smear_par[7] = 0.;
00373 smear_par[8] = 0.;
00374 }
00375 }else {
00376 cerr<<"Unknown option: "<<argv[i]<<endl;
00377 }
00378 }
00379
00380 if( ( EBeam < 100 || EBeam > 25000 ) && !IsNoVacPol ){
00381 cerr<<"Invalid value of beam energy:"<<EBeam<<endl;
00382 exit(1);
00383 }
00384
00385 gGlobal->Set_TotalError(te);
00386
00387 gGlobal->Set_RelativeError(re);
00388
00389 gGlobal->Set_Type(proc);
00390
00391 gGlobal->Set_E(EBeam);
00392
00393 gGlobal->Set_ThetaInt(ti);
00394
00395 if(0>td)
00396 gGlobal->Set_ThetaMin(at-dt/2);
00397 else
00398 gGlobal->Set_ThetaMin(td);
00399
00400 if(0>de){
00401 if(proc==0)
00402 gGlobal->Set_dE_Abs(0.015*EBeam);
00403 else
00404 gGlobal->Set_dE_Abs(0.0003*EBeam);
00405 }
00406 else
00407 gGlobal->Set_dE_Abs(de);
00408
00409 if(0>nt0)
00410 gGlobal->Set_Theta0_Rel(1.5);
00411 else
00412 gGlobal->Set_Theta0_Rel(nt0);
00413
00414 if(0<thm_min){
00415 gCut->ThetaRangeM(thm_min, thm_max);
00416 gGlobal->Set_ThetaMin((thm_min<M_PI-thm_max)?thm_min:M_PI-thm_max);
00417 cout<<"Miminal angle = "<<((thm_min<M_PI-thm_max)?thm_min:M_PI-thm_max)<<endl;
00418
00419 }
00420
00421 if(0<thp_min){
00422 gCut->ThetaRangeP(thp_min, thp_max);
00423 }
00424 gCut->CosPsi(cos(pc));
00425
00426 gCut->DeltaTheta(dt);
00427
00428 gCut->AverageTheta(at);
00429
00430 gCut->DeltaPhi(dp);
00431
00432 gCut->PAverage(am);
00433
00434 gCut->PCross(cm);
00435
00436 gCut->EMin(em);
00437
00438 gConst->SetAlphaScale(al);
00439
00440 if(IsVerbose) gConst->Print();
00441
00442 gGlobal->Init();
00443 if(IsVerbose) gGlobal->Print();
00444
00445 gCut->Init();
00446 if(IsVerbose) gCut->Print();
00447
00448 if(NSim>0)
00449 cout<<"NSim = "<<NSim<<endl;
00450
00451 if(fname.size()>0)
00452 cout<<"fname = "<<fname<<endl;
00453
00454 cout<<"Cross-section statistical precision will be better than "
00455 <<gGlobal->Get_TotalError()<<" nb and "
00456 <<gGlobal->Get_RelativeError()*100<<"%"<<endl;
00457
00458 if(IsBrem)
00459 cout<<"Bremsstrahlung on beam pipe is switched on!"<<endl;
00460
00461 if(IsSmear)
00462 cout<<"Angles will be smeared!"<<endl;
00463
00464 if(IsTuple && NSim>0)
00465 cout<<"Ntuple will be sampled!"<<endl;
00466
00467 if(!IsHardPhoton)
00468 cout<<"Hard photon on big angle is not included!"<<endl;
00469
00470 if(IsNoVacPol)
00471 cout<<"Vacuum polarization is not included!"<<endl;
00472
00473 if(!IsFSR)
00474 cout<<"Final state radiation is not included!"<<endl;
00475
00476 cout<<flush;
00477
00478 return proc;
00479 }
00480
00481 void hist_sample(Int_t iproc){
00482 ostringstream ost;
00483
00484
00485 double theta_res[3],phi_res[3],d;
00486 if(IsSmear){
00487 ost<<"angular"<<Int_t(EBeam+0.5)<<".dat"<<ends;
00488 cout<<"Try to open file with angular resolution."<<endl<<flush;
00489 cout<<ost.str()<<endl<<flush;
00490 ifstream IN(ost.str().c_str());
00491 if(IN){
00492 for(int i=0;i<3;i++)IN>>theta_res[i]>>d;
00493 for(int i=0;i<3;i++)IN>>phi_res[i]>>d;
00494 IN.close();
00495 }else{
00496 cout<<"Unable to open file. Assume that detector is ideal."<<endl;
00497 IsSmear = 0;
00498 }
00499 }
00500
00501 TFile *f = NULL;
00502 string file_name;
00503 if(fname == ""){
00504 ost.str(""); ost<<"";
00505 if(!IsTuple){
00506 ost<<proc_name[iproc]<<Int_t(EBeam+0.5)<<"hist_new_a2.root"<<ends;
00507 }else{
00508 ost<<proc_name[iproc]<<Int_t(EBeam+0.5)<<"tuple.root"<<ends;
00509 }
00510 file_name = ost.str();
00511 } else {
00512 file_name = fname;
00513 }
00514 cout<<"Try to open output file."<<endl<<flush;
00515 cout<<file_name<<endl<<flush;
00516 f = new TFile(file_name.c_str(),"RECREATE");
00517 cout<<"file opened."<<endl<<flush;
00518
00519 Double_t width = 0.5;
00520 Double_t pmin = 90.;
00521 Double_t pmax = TMath::Sqrt(EBeam*EBeam-mass[iproc]*mass[iproc]);
00522 pmax *= 1. + 1.e-5;
00523 Int_t nbins = int((pmax-pmin)/width);
00524
00525
00526 const Int_t ncth = 4, ndth = 5;
00527 TH2D *h[ncth][ndth];
00528 TTree *tree=NULL;
00529 static EVENT event;
00530 if(!IsTuple){
00531
00532 for(int i=0; i<ncth; i++){
00533 for(int j=0; j<ndth; j++){
00534 ost.str(""); ost<<proc_name[iproc]<<"_"<<i<<"_"<<j<<ends;
00535 string name = ost.str();
00536
00537 ost.str(""); ost<<setw(3)<<setprecision(2)<<1.0+i*0.1;
00538 string hth = ost.str();
00539
00540 ost.str(""); ost<<setw(4)<<setprecision(2)<<0.25-j*0.05;
00541 string dth = ost.str();
00542
00543 ost.str(""); ost<<"Energy="<<Int_t(EBeam+0.5)<<" MeV, Theta_Cut="
00544 <<hth<<", Delta_Theta="<<dth<<ends;
00545
00546 h[i][j] = new TH2D(name.c_str(), ost.str().c_str(),nbins,pmin,pmax,nbins,pmin,pmax);
00547 h[i][j]->SetDirectory(f);
00548 }
00549 }
00550 }else{
00551
00552 ost.str("");ost<<proc_name[iproc]<<"tuple"<<ends;
00553 tree = new TTree(ost.str().c_str(),"Simulation");
00554 tree->Branch("event",&event,"Tptot[3]/F:Tth[3]/F:Tphi[3]/F:Tptott[3]/F:Ttht[3]/F:Tphit[3]/F:Vz:Type/I");
00555 tree->SetDirectory(f);
00556 }
00557
00558 const Double_t alpha = 0.365073;
00559 Double_t ar;
00560 const Double_t br = 105.76;
00561 Double_t r;
00562
00563 Double_t p1,t1,f1,p2,t2,f2;
00564 Double_t bp1,bp2;
00565 Double_t smt1,smt2,smf1,smf2,th_a;
00566 Double_t prev, now, f_shift;
00567 UInt_t type;
00568 prev = timer->RealTime();
00569 for(int i=0; i<NSim; i++){
00570
00571 gRad->MakeEvent(p1,t1,f1,p2,t2,f2,type);
00572 p1 *= EBeam;
00573 p2 *= EBeam;
00574
00575
00576 if(iproc == 0 && IsBrem ){
00577 r = gRandom->Rndm();
00578 ar = TMath::Power(p1/(p1-pmin),alpha);
00579 bp1 = p1*(1.-TMath::Power(1./(ar*r-br*(r-1.)),1/alpha));
00580
00581 r = gRandom->Rndm();
00582 ar = TMath::Power(p2/(p2-pmin),alpha);
00583 bp2 = p2*(1.-TMath::Power(1./(ar*r-br*(r-1.)),1/alpha));
00584
00585 }else{
00586 bp1 = p1;
00587
00588 bp2 = p2;
00589
00590 }
00591
00592 if(IsSmear){
00593
00594 f_shift = 2*M_PI*gRandom->Rndm();
00595
00596 f1 += f_shift;
00597 f2 += f_shift;
00598
00599 if(gRandom->Rndm()<theta_res[0])
00600 smt1 = t1 + gRandom->Gaus(0.,theta_res[1]);
00601 else
00602 smt1 = t1 + gRandom->Gaus(0.,theta_res[2]);
00603
00604 if(gRandom->Rndm()<theta_res[0])
00605 smt2 = t2 + gRandom->Gaus(0.,theta_res[1]);
00606 else
00607 smt2 = t2 + gRandom->Gaus(0.,theta_res[2]);
00608
00609 if(gRandom->Rndm()<phi_res[0])
00610 smf1 = f1 + gRandom->Gaus(0.,phi_res[1]);
00611 else
00612 smf1 = f1 + gRandom->Gaus(0.,phi_res[2]);
00613
00614 if(gRandom->Rndm()<phi_res[0])
00615 smf2 = f2 + gRandom->Gaus(0.,phi_res[1]);
00616 else
00617 smf2 = f2 + gRandom->Gaus(0.,phi_res[2]);
00618
00619 }else{
00620
00621 smt1 = t1;
00622 smt2 = t2;
00623 smf1 = f1;
00624 smf2 = f2;
00625
00626 }
00627
00628 if(smf1<0) smf1 += 2*M_PI;
00629 if(smf1>2*M_PI) smf1 -= 2*M_PI;
00630 if(smf2<0) smf2 += 2*M_PI;
00631 if(smf2>2*M_PI) smf2 -= 2*M_PI;
00632 if(f1<0) f1 += 2*M_PI;
00633 if(f1>2*M_PI) f1 -= 2*M_PI;
00634 if(f2<0) f2 += 2*M_PI;
00635 if(f2>2*M_PI) f2 -= 2*M_PI;
00636
00637 if(IsTuple){
00638 event.Tptot[0] = bp1;
00639 event.Tptot[1] = bp2;
00640 event.Tth[0] = smt1;
00641 event.Tth[1] = smt2;
00642 event.Tphi[0] = smf1;
00643 event.Tphi[1] = smf2;
00644 event.Tptott[0]= p1;
00645 event.Tptott[1]= p2;
00646 event.Ttht[0] = t1;
00647 event.Ttht[1] = t2;
00648 event.Tphit[0] = f1;
00649 event.Tphit[1] = f2;
00650 event.Type = type;
00651
00652 double ttt[4*4];
00653 int npart;
00654 gRad->GetCrossPart()->GetEvent(ttt,npart);
00655
00656 int j=2;
00657 if(npart>3)
00658 if(ttt[2*4+3]<ttt[3*4+3]) j = 3;
00659
00660 event.Tptot[2] = 1000*ttt[j*4+3];
00661 event.Tth[2] = acos(ttt[j*4+2]);
00662 event.Tphi[2] = atan2(ttt[j*4+1],ttt[j*4+0]);
00663
00664 }
00665
00666 th_a=0.5*(smt1+M_PI-smt2);
00667 Double_t delta_th = TMath::Abs(smt1+smt2-M_PI);
00668 if(th_a > 1.0 && th_a < M_PI-1.0 &&
00669 delta_th<0.25 &&
00670 TMath::Abs(TMath::Abs(smf1-smf2)-M_PI)<0.15){
00671 if(!IsTuple){
00672 for(int i=0; i<ncth; i++)
00673 for(int j=0; j<ndth; j++){
00674 if(th_a > 1.+i*0.1 && th_a < M_PI - (1.+i*0.1) &&
00675 delta_th<0.25-j*0.05 ) h[i][j]->Fill(bp1,bp2);
00676 }
00677 }
00678 if(!(i%(NSim/100))){
00679 timer->Stop();
00680 now = timer->RealTime();
00681 if(now-prev>1){
00682 cout<<"REALTIME = "<<now<<", "
00683 <<"CPUTIME = "<<timer->CpuTime()<<", "
00684 <<"EVENTNUM = "<<i<<", "
00685 <<"p1 = "<<p1<<", "
00686 <<"p2 = "<<p2
00687 <<endl
00688 <<flush;
00689 prev = now;
00690 }
00691 timer->Start(kFALSE);
00692 }
00693 if(IsTuple) event.Vz = 1.;
00694 }else{
00695 if(IsTuple) event.Vz = 0.;
00696 }
00697 if(IsTuple) tree->Fill();
00698 }
00699 cout<<"Histogram has been sampled!"<<timer->RealTime()<<endl<<flush;
00700
00701 if(!IsTuple){
00702 for(int i=0; i<ncth; i++)
00703 for(int j=0; j<ndth; j++)
00704 h[i][j]->Write();
00705 }else{
00706 tree->Write();
00707 }
00708
00709 f->Purge();
00710 cout<<"Histogram has been written!"<<timer->RealTime()<<endl<<flush;
00711 if(!IsTuple)
00712 for(int i=0; i<ncth; i++)
00713 for(int j=0; j<ndth; j++)
00714 delete h[i][j];
00715 if(IsTuple) delete tree;
00716 delete f;
00717 cout<<"File has been closed!"<<timer->RealTime()<<endl<<flush;
00718 }
00719
00720 void hist_sample_angle(Int_t iproc){
00721 ostringstream ost;
00722
00723
00724 TFile *f = NULL;
00725 string file_name;
00726 if(fname == ""){
00727 ost.str(""); ost<<"";
00728 ost<<proc_name[iproc]<<Int_t(EBeam+0.5)<<".root"<<ends;
00729 file_name = ost.str();
00730 } else {
00731 file_name = fname;
00732 }
00733 cout<<"Try to open output file."<<endl<<flush;
00734 cout<<file_name<<endl<<flush;
00735 f = new TFile(file_name.c_str(),"RECREATE");
00736
00737 const double MAX_DPHI = 0.3, MAX_DTH = 0.5;
00738 const int ndphi = 6, ndth = 10;
00739 TH1D *hdth[ndphi];
00740 TH1D *hdphi[ndth];
00741
00742
00743 for(int i=0; i<ndphi; i++){
00744 ost.str(""); ost<<proc_name[iproc]<<"_dth_"<<i;
00745 string name = ost.str();
00746
00747 ost.str(""); ost<<setw(3)<<setprecision(2)<<MAX_DPHI - i*0.05;
00748 string dphi = ost.str();
00749
00750 ost.str(""); ost<<"#Delta#theta, Energy = "<<Int_t(EBeam+0.5)<<" MeV, "
00751 <<"#Delta#phi = "<<dphi;
00752 int nbins = 600;
00753 double dth_min = 0;
00754 double dth_max = MAX_DTH;
00755 hdth[i] = new TH1D(name.c_str(), ost.str().c_str(), nbins, dth_min, dth_max);
00756 hdth[i]->SetDirectory(f);
00757 }
00758
00759 for(int i=0; i<ndth; i++){
00760 ost.str(""); ost<<proc_name[iproc]<<"_dphi_"<<i;
00761 string name = ost.str();
00762
00763 ost.str(""); ost<<setw(3)<<setprecision(2)<<MAX_DTH - i*0.05;
00764 string dth = ost.str();
00765
00766 ost.str(""); ost<<"#Delta#phi, Energy = "<<Int_t(EBeam+0.5)<<" MeV, "
00767 <<"#Delta#theta = "<<dth;
00768 int nbins = 600;
00769 double dphi_min = 0;
00770 double dphi_max = MAX_DPHI;
00771 hdphi[i] = new TH1D(name.c_str(), ost.str().c_str(), nbins, dphi_min, dphi_max);
00772 hdphi[i]->SetDirectory(f);
00773 }
00774
00775 Double_t p1,t1,f1,p2,t2,f2;
00776 UInt_t type;
00777 double prev = timer->RealTime(), now;
00778 for(int i=0; i<NSim; i++){
00779
00780 gRad->MakeEvent(p1,t1,f1,p2,t2,f2,type);
00781 double a_delta_th = fabs(t1 + t2 - M_PI);
00782 double a_delta_phi = fabs(fabs(f1 - f2) - M_PI);
00783
00784 for(int j=0; j<ndphi; j++)
00785 if ( a_delta_phi < MAX_DPHI - j*0.05 ) hdth[j]->Fill(a_delta_th);
00786
00787 for(int j=0; j<ndth; j++)
00788 if ( a_delta_th < MAX_DTH - j*0.05 ) hdphi[j]->Fill(a_delta_phi);
00789
00790 if(!(i%(NSim/100))){
00791 timer->Stop();
00792 now = timer->RealTime();
00793 if(now-prev>1){
00794 cout<<"REALTIME = "<<now<<", "
00795 <<"CPUTIME = "<<timer->CpuTime()<<", "
00796 <<"EVENTNUM = "<<i<<", "
00797 <<"p1 = "<<p1<<", "
00798 <<"p2 = "<<p2
00799 <<endl
00800 <<flush;
00801 prev = now;
00802 }
00803 timer->Start(kFALSE);
00804 }
00805 }
00806 cout<<"Histogram has been sampled!"<<timer->RealTime()<<endl<<flush;
00807
00808 for(int i=0; i<ndphi; i++)
00809 hdth[i]->Write();
00810
00811 for(int i=0; i<ndth; i++)
00812 hdphi[i]->Write();
00813
00814
00815 f->Purge();
00816 cout<<"Histogram has been written!"<<timer->RealTime()<<endl<<flush;
00817
00818 for(int i=0; i<ndphi; i++)
00819 delete hdth[i];
00820
00821 for(int i=0; i<ndth; i++)
00822 delete hdphi[i];
00823
00824 delete f;
00825 cout<<"File has been closed!"<<timer->RealTime()<<endl<<flush;
00826 }
00827
00828 void hist_sample_comp(){
00829
00830 TFile *f = NULL;
00831 if(fname == "") return;
00832 cout<<"Try to open output file."<<endl<<flush;
00833 cout<<fname<<endl<<flush;
00834 f = new TFile(fname.c_str(),"RECREATE");
00835
00836 double elemass = gConst->Me();
00837 double ebeam = gGlobal->Get_E();
00838 double emin = 0.8*ebeam;
00839 double thmin = gGlobal->Get_ThetaMin()*180/M_PI;
00840 double thmax = 180 - thmin;
00841 TH1D *an = new TH1D("an","Electron angle", 200, thmin - 1, thmax + 1);
00842 TH1D *en = new TH1D("en","Electron energy", 200, emin - 10, ebeam + 10);
00843 TH1D *ac = new TH1D("ac","Accolinearity", 200, -1, 11);
00844 TH1D *me = new TH1D("me","Missing energy", 200, -10, 0.4*ebeam);
00845 TH1D *ma = new TH1D("ma","Angle of missing energy",200,-1,181);
00846
00847 Double_t prev, now;
00848 prev = timer->RealTime();
00849 for(int i=0; i<NSim; i++){
00850 Double_t p1,t1,f1,p2,t2,f2;
00851 UInt_t type;
00852 gRad->MakeEvent(p1,t1,f1,p2,t2,f2,type);
00853 p1 *= EBeam;
00854 p2 *= EBeam;
00855
00856 an->Fill(t1*180/M_PI);
00857 double ele_en = sqrt(p1*p1 + elemass*elemass);
00858 double pos_en = sqrt(p2*p2 + elemass*elemass);
00859 if(ele_en>ebeam) ele_en = ebeam;
00860 if(pos_en>ebeam) pos_en = ebeam;
00861 en->Fill(ele_en-1e-12);
00862 ac->Fill(fabs(t1 + t2 - M_PI)*180/M_PI);
00863 double miss_en = 2*ebeam - ele_en - pos_en;
00864 if(miss_en>0.02*ebeam){
00865 me->Fill(miss_en);
00866 double cth0,sth0,cphi0,sphi0,cth1,sth1,cphi1,sphi1;
00867 sincos(t1, &sth0, &cth0);
00868 sincos(t2, &sth1, &cth1);
00869 sincos(f1,&sphi0,&cphi0);
00870 sincos(f2,&sphi1,&cphi1);
00871 double px = p1*sth0*cphi0 + p2*sth1*cphi1;
00872 double py = p1*sth0*sphi0 + p2*sth1*sphi1;
00873 double pz = p1*cth0 + p2*cth1;
00874 ma->Fill(acos(pz/sqrt(px*px+py*py+pz*pz))*180/M_PI);
00875 }
00876
00877 if(!(i%(NSim/100))){
00878 timer->Stop();
00879 now = timer->RealTime();
00880 if(now-prev>1){
00881 cout<<"REALTIME = "<<now<<", "
00882 <<"CPUTIME = "<<timer->CpuTime()<<", "
00883 <<"EVENTNUM = "<<i<<", "
00884 <<"p1 = "<<p1<<", "
00885 <<"p2 = "<<p2
00886 <<endl
00887 <<flush;
00888 prev = now;
00889 }
00890 timer->Start(kFALSE);
00891 }
00892 }
00893 cout<<"Histogram has been sampled!"<<timer->RealTime()<<endl<<flush;
00894 f->Write();
00895 delete f;
00896 cout<<"File has been closed!"<<timer->RealTime()<<endl<<flush;
00897 }
00898