FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 partdltz.cpp - description 00003 ------------------- 00004 begin : Sun May 9 2004 00005 copyright : (C) 2004 by gmp 00006 email : peppe@newpeppe 00007 *************************************************************************** 00008 * * 00009 * NA48 simulation program. * 00010 * * 00011 ***************************************************************************/ 00012 00013 #define EPSR 1.0E-200 00014 00015 #include "flyoh.h" 00016 using namespace GmpConst; 00017 00019 // D a l i t z 00020 //-------------------------------------------------------------- 00021 // Get the Dalitz pair mass and decay angles 00022 00023 void PartDltz:: 00024 DecParm() 00025 { 00026 00027 // Attenzione questa routine vale solo per la 00028 // produzione di dalitz pair nel decadimento del mesone pi0 in gam e e 00029 // si suppone una distribuzione che va come df/dmq=(1-mq/mpiq)**3 *1./mq; 00030 // limiti tra 2 volte la massa dell'elettrone e quella del pi0. 00031 // mass electron= 0.00051 , mass pi0 = 0.13497 (**2=0.0182169009) 00032 // vedi anche "Selected problems in theoretical physics" 00033 00034 double wtot=0.0,x=0.0,xq=0.0,aux=0.0; 00035 int i,j=0; 00036 //============================================================== 00037 // inizializza la forma integrale della distribuzione di massa normalizzata. 00038 if(dlznorm==0.0) 00039 { 00040 xmindlz=0.0075572349; // = 2 me/mpio 00041 xmaxdlz=1.0; 00042 stepdlz=(xmaxdlz-xmindlz)/100000.; 00043 probdlz[0]=0.0; 00044 00045 for (i=1;i<100000;i++) 00046 { x=xmindlz+stepdlz*i; 00047 xq=x*x; 00048 aux=1.-xq; 00049 wtot+= (aux*aux*aux)/x; // df/dm 00050 if(i%1000 ==0) 00051 {j++; 00052 probdlz[j]=wtot; 00053 00054 } 00055 } 00056 // normalizzo.... 00057 probdlz[100]=1.0; 00058 probdlz[101]=10.0; 00059 stepdlz=(xmaxdlz-xmindlz)/100.; 00060 dlznorm=1./wtot; 00061 for (i=1;i<101;i++) probdlz[i]*= dlznorm; 00062 } 00063 00064 //============================================================= 00065 //------------------------------------------ 00066 // qui comincia normalmente... get massa and angles 00067 00068 double drm; 00069 double R=Pran(); 00070 i=1; 00071 while(1) 00072 { 00073 if( probdlz[i]>R)break; 00074 i++; 00075 } 00076 // interpolazione ..... piu' peso alle basse masse 00077 drm=(R-probdlz[i-1])/(probdlz[i]-probdlz[i-1]); 00078 double mm=xmindlz+(i-1.0+drm*drm)*stepdlz; 00079 00080 P[3] = P.m=massa=massdlz=mm*0.13497; 00081 00082 00083 00084 SelRea->Dalitz_done++; 00085 00086 00087 // calcolo la direzione di decadimento dei figli. 00088 00089 // double cost = 1.0 - 2.0 * Pran(); 00090 /**********/ 00091 double rdm=2.*Pran()-1.0; // ==cos(tet)**2 00092 double cost = exp(log( fabs(rdm)+EPSR)/3.); 00093 if(rdm<0.0)cost=-cost; 00094 /************* 00095 double cost = 1.0; 00096 while (1) 00097 { 00098 cost = 1.0 - 2.0 * Pran(); 00099 if(Pran()<(cost*cost)) break; 00100 00101 } 00102 ********* 00103 double cost = 1.0; 00104 if(Pran()<0.5)cost=-1; 00105 *******/ 00106 00107 double fi = DuePiGreco * Pran(); 00108 dw->cstar=cost; dw->fistar=fi; 00109 dw->rg->cstar=-cost; dw->rg->fistar=fi+PiGreco; 00110 return; 00111 }