FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 devrtcl.cpp - description 00003 ------------------- 00004 begin : Sat May 26 2001 00005 copyright : (C) 2001 by Giuseppe Pierazzini 00006 email : peppe@unipi.it 00007 *************************************************************************** 00008 * * 00009 * NA48 simulation program. * 00010 * * 00011 ***************************************************************************/ 00012 #include "parm.h" 00013 #include "devrtcl.h" 00014 00015 // using namespace std; 00016 00017 00018 //================== DevRtCl=======Erede di DevRt 00019 DevRtCl::DevRtCl() 00020 { 00021 devtype=TypDevRtCl; 00022 devclass="Rett_Cili"; 00023 rin = Lin[1]=Lin[0]; 00024 rinq=rin*rin; 00025 } 00026 00027 //----------------- -------- 00028 void DevRtCl::Prgeom() 00029 { 00030 Gout<<"================== R i v e l a t o r e ================="; 00031 Gout<<"\n --> < "<<nome <<" > [ "<<fun 00032 <<" ] Rettang. con buco cilin di rin "<<rin; 00033 Device::Prgeom(); 00034 00035 } 00036 00037 //====================================================== 00038 //----------------- -----P o s i z i o n e --- 00039 int DevRtCl::Posizione() 00040 { 00041 if( DevRt::Posizione()>0) return 1; 00042 P_Cin=X_dev-Centrin; 00043 Dind=P_Cin-Lin; 00044 Dins=-(Lin+P_Cin); 00045 // se sono interno al rivelatore verifico se siamo nel buco 00046 if( (drinq= P_Cin[0]*P_Cin[0]+P_Cin[1]*P_Cin[1] )>rinq) return 0; 00047 // sono forse nel buco ...controllo meglio i limiti 00048 // in zeta. Ricordo Lin[2] e' la zeta della base destra... 00049 if( P_Cin[2]< -Lin[2] || P_Cin[2]> Lin[2]) return 0; // e' esterno 00050 // ritorno -1 perche' nel buco 00051 return -1; 00052 } 00053 //----------------------C a m E s t e r -------------------- 00054 // usa quella di DevRt per eredita' 00055 //=========================================================== 00056 //----------------------C a m I n t e r -------------------- 00057 00058 double DevRtCl::CamInter() 00059 { 00060 //uso quella di DevRt per calcolare il cammino 00061 // interno senza il buco... 00062 tratto=DevRt::CamInter(); 00063 //poi verifico se colpisce le pareti del buco ..... 00064 // calcolo il cammino positivo verso le superfici del cilindro interno. 00065 // e scelgo il cammino maggiore 00066 // calcolo i coefficienti della equazione intersezione di una retta con cili 00067 camm=-1.; 00068 // controllo se colpisce la base 00069 if((nv=V_dev[2])>0.0 && Dins[2]>0.0) // piani z 00070 {t=Dins[2]/nv; if(t>camm)camm=t;} 00071 else if(nv<0.0 && Dind[2]>0.0) 00072 {t=-Dind[2]/nv; if(t>camm)camm=t;} 00073 // 00074 a=V_dev[0]*V_dev[0]+V_dev[1]*V_dev[1]; 00075 if(a>0.0) //revised 31.07.01 gmp 00076 { 00077 b=V_dev[0]*P_Cin[0]+V_dev[1]*P_Cin[1]; 00078 if(b<0.) 00079 { 00080 c=drinq-rinq; 00081 if((dltq=b*b-a*c)>=0.0) 00082 { 00083 t= -(b + sqrt(dltq))/a; // Scelgo la soluzione minore 00084 if(t>=0.0) 00085 {// check limiti in zeta 00086 z=P_Cin[2]+nv*t; 00087 if(-Lin[2]<=z&&z<=Lin[2])camm=t; 00088 } 00089 } 00090 } 00091 } 00092 // quindi confronto camm con tratto e accetto il cammino piu' breve...... 00093 if(camm<0.0) {camm=tratto; return camm;} 00094 if(camm>0.0 && tratto<camm) camm=tratto; 00095 return camm; 00096 } 00097 //=============================================================== 00098 //--------------- C a m B u c o --------------------------------- 00099 double DevRtCl::CamBuco() 00100 { 00101 00102 camm=1.0e+10; 00103 // calcolo il cammino verso le superfici 00104 // quella cilindrica e dalle basi del cilindro. 00105 // scelgo il cammino positivo minore... 00106 // calcolo il cammino positivo verso la superfice del cilindro interno. 00107 // le soluzioni sono sempre di segno opposto. 00108 a=V_dev[0]*V_dev[0]+V_dev[1]*V_dev[1]; 00109 if(a>0.0) 00110 { 00111 b=V_dev[0]*P_Cin[0]+V_dev[1]*P_Cin[1]; 00112 c=drinq-rinq; // nota sempre negativo internamente al cilindro. 00113 if((dltq=b*b-a*c)>=0.0) 00114 { 00115 t= (-b + sqrt(dltq))/a; // Scelgo la soluzione positiva 00116 if(t>=0.0)camm=t; 00117 } 00118 } 00119 // controllo anche la zeta.... 00120 if((nv=V_dev[2])>0.0) // piani z 00121 {t=-Dind[2]/nv; if(t<camm)camm=t; } 00122 else if(nv<0.0) 00123 {t=Dins[2]/nv; if(t<camm)camm=t; } 00124 return camm; 00125 } 00126