FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
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