FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 devcrn.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 "devcrn.h" 00014 00015 // using namespace std; 00016 00017 DevCrn::~DevCrn() 00018 { 00019 } 00020 //================== Corona=======erede di Cilindro 00021 DevCrn::DevCrn() 00022 { 00023 devtype=TypDevCrn; 00024 devclass="Corona"; 00025 rin =Lin.y=Lin.x; 00026 Lin.Norma(); 00027 rinq=rin*rin; 00028 } 00029 00030 //----------------- -------- 00031 void DevCrn::Prgeom() 00032 { 00033 Gout<<"================== R i v e l a t o r e ================="; 00034 Gout<<"\n --> < "<<nome <<" > [ "<<fun 00035 <<" ] Corona con rout "<<rout<<" e rin "<<rin; 00036 Device::Prgeom(); 00037 00038 } 00039 00040 //====================================================== 00041 //----------------- -----P o s i z i o n e --- 00042 int DevCrn::Posizione() 00043 { 00044 if ( DevCln::Posizione() >0 ) return 1; // il punto e' esterno 00045 P_Cin=X_dev-Centrin; 00046 Dind.z=P_Cin.z-Lin.z; 00047 Dins.z=- ( Lin.z+P_Cin.z ); 00048 // se sono interno al rivelatore verifico se siamo nel buco 00049 if ( Dins.z>0.0 || Dind.z>0.0 || 00050 ( drinq=P_Cin.x*P_Cin.x+P_Cin.y*P_Cin.y ) >rinq ) return 0; //e' fouri buco 00051 return -1; // se nel buco 00052 } 00053 //----------------------C a m E s t e r -------------------- 00054 // usa quella di Cilindro per eredita' 00055 //=========================================================== 00056 //----------------------C a m I n t e r -------------------- 00057 00058 double DevCrn::CamInter() 00059 { 00060 //uso quella di Cilindro per calcolare il cammino 00061 // interno senza il buco... 00062 double ctratto=DevCln::CamInter(); 00063 //poi verifico se colpisce le pareti del buco ..... 00064 double b,c,dltq,t,nv,z; 00065 // calcolo il cammino positivo verso le superfici del cilind 00066 // e scelgo il cammino maggiore 00067 // calcolo i coefficienti della equazione intersezione di un 00068 camm=-1.; 00069 // controllo se colpisce la base 00070 if ( ( nv=V_dev.z ) >0.0 && Dins.z>0.0 ) // piani z 00071 { 00072 t=Dins.z/nv; 00073 if ( t>camm ) camm=t; 00074 } 00075 else if ( nv<0.0 && Dind.z>0.0 ) 00076 { 00077 t=-Dind.z/nv; 00078 if ( t>camm ) camm=t; 00079 } 00080 00081 00082 // 00083 if ( vxyq>0.0 ) 00084 { 00085 b=V_dev.x*P_Cin.x+V_dev.y*P_Cin.y; 00086 if ( b<0. ) // revised 31.07.01 gmp 00087 { 00088 c=drinq-rinq; 00089 if ( ( dltq=b*b-vxyq*c ) >=0.0 ) 00090 { 00091 t= - ( b + sqrt ( dltq ) ) /vxyq; // Scelgo la soluzione minore 00092 if ( t>=0.0 ) 00093 {// check limiti in zeta 00094 z=P_Cin.z+nv*t; 00095 00096 if ( -Lin.z<=z&&z<=Lin.z ) camm=t; 00097 } 00098 } 00099 } 00100 } 00101 00102 // quindi confronto camm con tratto e accetto il cammino piu' piccolo 00103 if ( camm<0.0 ) 00104 { 00105 camm=ctratto; 00106 return camm; 00107 } 00108 if ( camm>0.0 && ctratto<camm ) camm=ctratto; 00109 return camm; 00110 } 00111 //=========================================================== 00112 //--------------- C a m B u c o ----------------------------- 00113 double DevCrn::CamBuco() 00114 { 00115 double b,c,dltq,t,nv; 00116 camm=1.0e+10; 00117 // calcolo il cammino verso le superfici 00118 // quella cilindrica e dalle basi del cilindro. 00119 // scelgo il cammino positivo minore... 00120 // calcolo il cammino positivo verso la superfice del cilindr 00121 // le soluzioni sono sempre di segno opposto. 00122 00123 if ( vxyq>0.0 ) 00124 { 00125 b=V_dev.x*P_Cin.x+V_dev.y*P_Cin.y; 00126 c=drinq-rinq; // nota sempre negativo internament 00127 if ( ( dltq=b*b-vxyq*c ) >=0.0 ) 00128 { 00129 t= ( -b + sqrt ( dltq ) ) /vxyq; // Scelgo la soluzione positiva 00130 if ( t>=0.0 ) camm=t; 00131 } 00132 } 00133 // controllo anche la zeta.... 00134 if ( ( nv=V_dev.z ) >0.0 ) // piani z 00135 { 00136 t=-Dind.z/nv; 00137 if ( t<camm ) camm=t; 00138 } 00139 else if ( nv<0.0 ) 00140 { 00141 t=Dins.z/nv; 00142 if ( t<camm ) camm=t; 00143 } 00144 return camm; 00145 } 00146