FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_reaz/reabeam.cpp

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 
 All Classes Namespaces Files Functions Variables