FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_par/partlepton.cpp

00001 /***************************************************************************
00002  *   Copyright (C) 2005 by Giuseppe Pierazzini          Pisa 20.02.05      *
00003  *   pierazzini@unipi.it                                                   *
00004  *                                     F l y o                             *
00005  *   Epsi/NA48                                                             *
00006  ***************************************************************************/
00007 #include "flyoh.h"
00008 
00009 using namespace std;
00010 using namespace GmpConst;
00011 
00031 PartLepton::PartLepton()
00032 
00033 {
00034     type=Lepstar;
00035 
00036     Ecut=0.250;
00037     // attenzione questo taglio determina l'energia minima di soglia per la produzion del Brems.
00038     // Nella distribuzione della energia di ionizzazione rilasciata dagli elettrini  nel radiatore appare un picco
00039     // alla stessa energia di soglia su scelta.
00040     // Questa soglia determina anche il numero delle particelle (gamma. elettroni e positroni)
00041     // generati nella simulazione per ciascun evento.
00042 
00043     double mrap= ptr_Elec->Get_Massa()/massa;
00044     brems_factor=mrap*mrap;  //brems_factor=0.01;
00045     if (Abilita_Brems) Brems_Production=1;
00046     else Brems_Production=0;
00047 
00048     if (evento_.Gen.Event<1)
00049     {
00050         Gout<<"\n Classe PartLepton  : "<<nome;
00051         if (Abilita_Brems) Gout<<"*  done!  with Brems_factor: "<<setprecision(6)<<brems_factor;
00052         else Gout<<"  done! ";
00053     }
00054 
00055 }
00056 
00057 
00058 PartLepton::~PartLepton()
00059 {
00060 }
00061 
00064 int   PartLepton::
00065 Get_Brems(Device *dev,double &path,double &rad)
00066 {
00067 // questa procedura e' chiamata da Device::traccia()
00068 // se siamo qui....c' e' possibilita' di bremsstrhalung
00069 // nell'interno o nel buco del dev..
00070 //-----------------------------------------------
00071 // vedi l'articolo di Y. S. Tsai, Pair Production and Bremsstrahlung of Charged Leptons,
00072 // Rev. Moder. Phys. 46,1974
00073 
00075 // procedura:
00076 // 1- si accettano solo particelle con energia superiore a Ecut
00077 // 2- in ogni intervallo dx=step=frazione di lrad si
00078 //    verifica se viene emesso un gamma
00079 // 3- se si, se ne genera l'energia
00080 // 4- si aggiorna l'energia della particella madre e si
00081 //    passa all step successivo.
00082 // 5- l'energia di tutti i gamma emessi si sommano insieme
00083 // 6- flyo poi genera un gamma di brems unico a partire
00084 //    da un punto spaziale medio
00085 // see the blue book or the article of Tsai del 1974 Rev.Moder. Phys. 46,4
00086 //-------------------------------------------------
00087     double step,e,Emax, rapmx,rapmxq,rap,rapq,pmax;
00088     double eb=0.,prob,prand;
00089     double path_fatto,path_free,path_resta;
00090     double rad_length=rad;
00091 
00092 
00093 
00094 
00095 //  rad deve essere > 0 !!
00096 
00097     if (path<.1) return 0;   //ritorna subito per cammini insignificanti
00098 
00102 
00103     if (massa>0.0005) rad_length/=brems_factor;
00104     if (path/rad_length<0.000001) return 0;
00105 
00106     step=rad_length*0.1;
00107     e=P.e;
00108     if (e<Ecut) return 0;  // attenzione a questo cut... vedi il costruttore Partlepton()
00109     ebrem=mbrem=0.0;
00110     path_fatto=0.0;
00111     path_free=0.0;
00112 
00113 //  start loop
00114     while (path_fatto<path)
00115     {
00116         path_resta=path-path_fatto;
00117         if (step>path_resta) step=path_resta;
00118 
00119 
00120         e-=dev->Msperdita(step);       // stima della energia persa per msc.
00121 
00122         Emax=e-massa;
00123         rapmx= (Emax-Ecut)/e;
00124         rapmxq=rapmx*(Emax+Ecut)/e;
00125         pmax=(1.33333*(log(Emax/Ecut)-rapmx) + .5*rapmxq);
00126 
00127 //test to make a brems
00128 
00129         if (Pran()<pmax*step/rad_length) // makes a gam...
00130         {
00131 //  get gam energy  
00132 //  con eb =(Ecut+alfa(Emax-Ecut)
00133 //  rap = (eb-Ecut)/e = (Ecut+alfa(Emax-Ecut)-Ecut)/e = alfa*rapmx
00134             prand=Pran()*pmax;
00135             for (double alfa=0.0;alfa<1.;alfa+=0.001) // in step del permille
00136             {
00137                 rap=alfa*rapmx;
00138                 rapq=alfa*alfa*rapmxq;
00139                 eb =Ecut+e*rap;
00140                 prob=(1.33333*(log(eb/Ecut)-rap) + .5*rapq);
00141                 if (prand<prob) break;
00142             }
00143             ebrem+=eb;
00144             e-=eb;
00145             path_free+=(path_fatto+Pran()*step)*eb;
00146         }
00147 
00148         if (e<=Ecut) break;   // vedere meglio????
00149         path_fatto+=step;
00150     }
00151 
00152     if (ebrem>0.0)      // bremsstrhalung ok...
00153     {
00154         Brems_Production=2;  // brems fatto....
00155         fato=Decay;// si fa per dire....si fa decare?!
00156         Ifato=-13;
00157         path_free/=ebrem;     //cammino libero prima di decadere: punto piu' probabile..
00158         SelRea->Brem_done++;
00159         dev->Brem_done++;
00160        
00161         if (Debugon==1)
00162         {
00163             P.print( nome);
00164             X.print(nome);
00165             Gout<<"\n Brlm "<<evento_.Gen.Event<<" "
00166             <<fato<< " dw "<<dw
00167             << " dev " << dev->Get_Nome()<<" Brem_done "<<dev->Brem_done
00168             << "  path " <<path<<"  free "<<path_free;
00169         }
00170         path=path_free;
00171 
00172 // generate the new partcles: un nuovo leptone ed un gamma
00173 // max defined into device cards...
00174         Particella *pb,*pc;
00175 // electron o muon      test se  possono fare ancora brems...
00176         Partname=nome;
00177         if (Abilita_Brems>0&&dev->Brem_done<=dev->maxBrems) {
00178             pb = new PartLepton();
00179         }
00180         else pb= new Particella();  //no brems....
00181 
00182 // gamma di brems...test se  può fare pair production ...
00183         Partname=Gam;
00184         if (Abilita_Pair>0&& dev->Pair_done<=dev->maxPair)   {
00185             pc = new PartGam();  // no pair production
00186         }
00187         else pc= new Particella();
00188 // links: attention here the link is broken to the older particle... but see Restore_link
00189 // attenzione non alterare la sequenza dei link....altrimenti cambiano gli Id
00190         dw=pb;
00191         pb->up=this;
00192         pb->rg=pc;
00193         pc->lf=pb;
00194         pc->up=this;
00195         pb->Set_Id();
00196         pc->Set_Id();
00197 
00198         return -13;  //brems ok
00199 
00200     }
00201     return 0;  // no brems
00202 }
00203 //-------------------------------------------------
00204 //     B r e m s s t r h a l u n g
00205 //     produzione di gamma da elettroni
00206 //--------------------------------------------------------------
00207 // Get the brems mass  (attenzione al decadimento)
00208 
00209 void  PartLepton::
00210 DecParm_Brems()
00211 {
00212 // Attenzione questa routine vale solo per la produzione
00213 // di gamma da bremsstrahlung
00214 // Procedura
00215 // Si ridefiniscono i parametri della particella che fa bresstrhalung
00216 // immaginandola una particella con massa virtuale che decade in lepton piu gamma
00217 // di bremsstrhalung di energia ebrem definata in Get_Brems().
00218 //-------------
00219 // (1)
00220 // calcolo la massa invariante del sistema e-gam con forma esponenziale..
00221 // partendo da un valore limite minimo che tiene conto dell'energia del gamma emesso
00222 // (2)
00223 // ridefinizione del quadrimpulso della particella padre
00224 // si aggiorna la massa (virtuale) e si ricalcola l'energia
00225 // (3)
00226 // nota l'energia del gamma nel lab, calcolo il coseno* di decadimento
00227 // compatibile con l'energia (ebrem) del gamma nel lab.
00228     if (Debugon==1)
00229     {
00230         P.print( "Qpatre");
00231         Gout<<" Brem_ev "<<evento_.Gen.Event;
00232     }
00233 
00234     if (fato!=Decay || dw==0) return ;
00235     double Et,Ele,pe,masmin;
00236     Et= Qpatre.e;
00237     Ele=Et-ebrem;
00238 
00239 // caso perdita energia per multiple scattering aggiusta...
00240     if (Ele<Ecut)
00241     {
00242 //        Gout<<"\n *** ERRORE *** Ev "<<evento_.Gen.Event<<setprecision(4)<<" ebrem "<< ebrem<<"  Ele "<<Ele<<"Q.e  "<< Qpatre.e;
00243         Ele=Ecut;
00244         ebrem=Et-Ecut;
00245     }
00246 
00247 
00248     pe=sqrt(Ele*Ele-massa*massa);
00249     masmin = sqrt( massa*massa + 2.*(Ele -pe)*ebrem);
00250 
00251 //   Gout<<"\nDecBrem:  Ev "<<evento_.Event<<"  Ele "<<Ele<<" ebrem="<<ebrem<<" ms="<<masmin;
00252 
00253 // genero la massa a random esponenzialmente partendo dalla minima... ...piccola
00254 //    mbrem= -0.001*log(Pran()+EPSI)+masmin;  //larghezza ... mev
00255     mbrem= -0.01*log(Pran()+EPSI)+masmin;  //larghezza ... mev
00256     mbremq= mbrem*mbrem;
00257     SelRea->mbrem=mbrem;  //ricorda l'energia in reazione...
00258     Qpatre.m=mbrem;
00259     Qpatre.mq=mbremq;
00260 // piccola correzione (rinormalizzazione)  dell 'impulso... della particella padre
00261 // a energia totale costante....
00262 
00263     Qpatre.Impulso();
00264 
00265 
00266 // calcolo il coseno* di decadimento
00267     double  gamma = Qpatre.e/Qpatre.m;
00268     double  beta  = Qpatre.norma/Qpatre.e;
00269 
00270     double    pstar = 0.5*(mbremq-massa*massa)/mbrem;   // = Estar del gamma
00271 
00272 //    double cost = (Ele-ebrem-gamma*massa*massa/mbrem)/(2.*beta*gamma*pstar);
00273     double cost = -(ebrem-gamma*pstar)/(beta*gamma*pstar);
00274 
00275 //      Gout<<"\n ebrem "<< ebrem<<"  mbrem "<<mbrem<<"  pstar "<<pstar<<"  cos "<<cost;
00276     /*
00277     //if(evento_.Event>83500)
00278     {
00279        char sbuf[128];
00280        sprintf(sbuf,"\nDecBrem: Ev %6d id  %2d ET %10.6f Ele %10.6f pe %10.6f Min  %8.6f  mb %8.6f  eb %10.6f cs  %8.6f z %8.1f ",
00281                        evento_.Event,id,Et,Ele,pe,masmin,mbrem,ebrem,cost,X.z);
00282        Gout<<sbuf;
00283        P.print(evento_.Event,nome,id,"DecBrem");
00284        Qpatre.print(evento_.Event,nome,id,"qPatre");Gout<<endl;
00285     }
00286     */
00287 
00288 // Ridefinisco Pbar....Attenzione se si dimentica si sbaglia lorentz....
00289     Pbar=Qpatre;
00290 //----------------------------------------------------------------
00291 // memorizzo la direzione di decadimento dei figli.
00292     double   fi = DuePiGreco * Pran();
00293     dw->cstar=cost;
00294     dw->fistar=fi ;             //fi  elettrone
00295     dw->rg->cstar=-cost;
00296     dw->rg->fistar=fi+PiGreco; //fi+pigrec  gam
00297 }
00298 
00299 
00300 
 All Classes Namespaces Files Functions Variables