FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 *** 00003 * * 00004 * NA48 simulation program. * 00005 * * 00006 ***************************************************************************/ 00007 00008 // 00009 // beam routine gmp Tirrenia 29-10-99 da... 00010 // Tirrenia 28.08.00 00011 00012 #include "flyoh.h" 00013 using namespace GmpConst; 00014 00015 00016 //--------------------------------------------------------------*/ 00017 // G e t b e a m */ 00018 //--------------------------------------------------------------*/ 00019 // get the beam ..... versione base 10.02.00 gmp 00020 // per le classe Reazione,Reapmd..............; 00021 // va bene per i decadimenti neutri e carichi... attenzione i carichi 00022 // 00023 00024 int Reazione:: 00025 Get_Beam () 00026 { 00027 //-------- genration loop 00028 //metodo 00029 // loop per l'estrazione di un impulso che soddisfi 00030 // all'ottica del fascio.... si verifica con 00031 // la distribuzione di Double. 00032 00033 int iter=0; 00034 double prb,fi,ro; 00035 double dwpb = 2.*wpinc; 00036 double volo=0.0; 00037 00038 double pathd=0.0; 00039 00040 // punto targhetta... 00041 ro=rtarg * sqrt ( Pran() ); 00042 fi= Pran() * DuePiGreco; 00043 Xtarg.setv ( ro*cos ( fi ), ro*sin ( fi ),dztarg* ( Pran() - 0.5 ) ); 00044 Xtarg+=Ctarg; 00045 00046 00047 00048 // calcolo la direzione di volo ricordando che deve passare per il 00049 // defining collimetor 00050 // ro= rcoll *pow(Pran(),.5); 00051 ro= rcoll *sqrt ( Pran() ); 00052 fi= Pran() *DuePiGreco; 00053 // User beam parameters; 00054 // ubeam=0:si sceglie il mom nell'intervallo fissato con distribuzione uniformewmente 00055 // ubeam=1 si sceglie con distribuzione gaussiana.....e forma ellittica 00056 if ( ubeam==0 ) 00057 { 00058 Vbeam.setv ( ro*cos ( fi ), ro*sin ( fi ), 0.0 ); // coordinate al collimatore virtuale di def. 00059 00060 } 00061 else 00062 { 00063 // coordinate al coll virt. con distr. ellitica (quando??) 00064 // Vbeam.setv ( ro*cos ( fi ), 0.8*ro*sin ( fi ), 0.0 ); 00065 Vbeam.setv ( ro*cos ( fi ), ro*sin ( fi ), 0.0 ); 00066 00067 } 00068 00069 Vbeam-=Xtarg-Ccoll; 00070 Vbeam.Norma(); // calcola la norma 00071 Vbeam=Vbeam.Verso(); // versore del beam.. 00072 Vbeam.putv( vxb,vyb,vzb ); 00073 00074 // selezione del momento 00075 00076 if ( ubeam==0 ) 00077 { 00078 while ( 1 ) // se la reazione dipende da teta spostare questo while in alto... 00079 { 00080 iter++; 00081 ppb = Pinc.norma + dwpb* ( Pran()-0.5 ); // dwpb intervallo in impulso... 00082 prb=Produci() /maxspettro; 00083 double rrr=Pran(); 00084 if ( rrr<prb ) break; 00085 00086 if ( iter>1000 ) 00087 { 00088 Gout<<"\nEv "<<evento_.Gen.Event<<" "<<avo->Get_Nome() <<" in rea_Id "<<id<<" Beam_error iter=" 00089 <<iter<<" Prb="<< prb<<" Pmx="<<maxspettro; 00090 break; // esco per forza 00091 } 00092 } 00093 } 00094 else ppb = Pgauss ( wpinc, Pinc.norma ); // beam a forma gaussiana(gvet_0) 00095 00096 00097 00098 pathd=Zona; 00099 00100 if ( ctau_avo_su_mass>0.0 ) 00101 { 00102 // la particella ha una massa ed una vita media 00103 volo = ctau_avo_su_mass * ppb; 00104 00105 while(1) 00106 { 00107 evento_.Gen.tempo=TBurst->Get_ProdTempo(); 00108 00109 pathd= - volo*log ( Pran() )- Xtarg.z; 00110 if(Beg_fid<=pathd&&pathd<=End_fid)break; 00111 00112 00113 } 00114 00115 /* 00116 // gli eventi sono generati solo nella regione di fiducia 00117 // per rendere il programma piu' efficiente, ma attenzione ai fondi....e normalizzazioni varie 00118 // conviene allora prendere una regione non limitata superiormente... 00119 */ 00120 00121 00122 00123 } 00124 else evento_.Gen.tempo=TBurst->Get_ProdTempo(); // se non decade..... 00125 00126 evento_.Gen.tdif=TBurst->Get_Tdif(); // differenza tra due eventi accettati..... 00127 evento_.Gen.burst=TBurst->Get_Nburst(); // differenza tra due eventi accettati...... 00128 00129 trasmessi++; 00130 00131 //----------------------------------------------------------------- 00132 avo->X = Xtarg; 00133 Pbeam= Vbeam*ppb; 00134 avo->P.setvn ( Pbeam,avo->Get_Massa() ); // P quadrivettore impulso energia 00135 avo->Vers=Vbeam; 00136 avo->path_max=pathd; 00137 avo->X2Gx(); 00138 avo->P2Gp(); 00139 avo->Set_Fato ( Nata,-1 ); 00140 avo->Set_Nata(); //nata=1; 00141 00142 return ( 1 ); 00143 } 00144 00145