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