FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 devcln.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 "devcln.h" 00014 #include "evento.h" 00015 00016 //using namespace std; 00017 00018 DevCln::~DevCln() 00019 { 00020 } 00021 //================== Cilindro=======Erede di RettEdro 00022 DevCln::DevCln() 00023 { 00024 devtype=TypDevCln; 00025 devclass="Cilindro"; 00026 rout=Lout.y=Lout.x; // simmetrizzo le coordinate x,y Lout.x sempre differente da 0 e = rout; 00027 routq=rout*rout; 00028 Lout.Norma(); 00029 Rqsize=Lout.normaq; 00030 00031 } 00032 00033 //----------------- -------- 00034 void DevCln::Prgeom() 00035 { 00036 Gout<<"================== R i v e l a t o r e ================="; 00037 Gout<<"\n --> < "<<nome <<" > [ "<<fun 00038 <<" ] Cilindro di rout "<< rout<<" senza buco. "; 00039 Device::Prgeom(); 00040 00041 } 00042 00043 //====================================================== 00044 //----------------- -----P o s i z i o n e --- 00045 int DevCln::Posizione() 00046 { 00047 00048 // Doutd=X_dev-Lout; Doutd.Norma(); 00049 // Douts= - ( Lout+X_dev ); Douts.Norma(); 00050 00051 Doutd.z=X_dev.z-Lout.z; //solo la componente z 00052 // Distanze dai piani dispari in Douts (per differenza). 00053 Douts.z= - ( Lout.z+X_dev.z ); // l'operatore unario "-" funge.... 00054 00055 if ( X_dev.normaq>Rqsize ) return 1; 00056 00057 drq= X_dev.x*X_dev.x+ X_dev.y*X_dev.y; 00058 vxyq=V_dev.x*V_dev.x+V_dev.y*V_dev.y; // per futuro uso 00059 if ( Douts.z>0.0 || Doutd.z>0.0 || drq>routq ) return 1; //e' fouri 00060 return 0; // zero se interno, 1 se esterno. 00061 00062 00063 } 00064 //---------------------------------------------------------- 00065 //----------------------C a m E s t e r -------------------- 00066 double DevCln::CamEster() 00067 { 00068 double b,c,dltq,t,nv; 00069 // calcolo il cammino positivo verso la superfice del cilindro. 00070 // e scelgo il cammino maggiore 00071 // calcolo i coefficienti della equazione intersezione di una retta con cil 00072 camm=-1.; 00073 00074 // se mi allontano ritorno -1. 00075 00076 00077 if ( ( nv=V_dev.z ) >0.0&&Doutd.z>0.0 )return -1.; 00078 00079 00080 00081 // ***** controllo se colpisce una delle basi 00082 00083 if ( nv >0.0 && Douts.z>0.0 ) // piani z 00084 {t=Douts.z/nv; if ( t>camm ) camm=t;} 00085 else if ( nv<0.0 && Doutd.z>0.0 ) 00086 {t=-Doutd.z/nv; if ( t>camm ) camm=t;} 00087 00088 // non ha colpito la base ... 00089 // ora verifico se colpisce il lato nei limiti di zeta... 00090 // revised 31.07.01 gmp 00091 00092 00093 if ( vxyq<=0.0 ) return camm; //per vxyq==0 corre lungo zeta /vedi Posizione() 00094 double z=0.; 00095 b=V_dev.x*X_dev.x+V_dev.y*X_dev.y; 00096 if ( b>0. ) return camm; 00097 c=drq-routq; 00098 if ( ( dltq=b*b-vxyq*c ) <0.0 ) return camm; 00099 t= - ( b + sqrt ( dltq ) ) /vxyq; // Scelgo la soluzione minore 00100 if ( t>=0.0 ) 00101 { 00102 // check limiti in zeta 00103 z=X_dev.z+nv*t; 00104 if ( -Lout.z<=z&&z<=Lout.z ) camm=t; 00105 } 00106 //*********** 00107 // if ( pr_dev->Get_Idm()==14 ) SpiaPr ( " Ester2 ", 49,49,camm ); 00108 return camm; 00109 } 00110 //=========================================================== 00111 //----------------------C a m I n t e r -------------------- 00112 00113 double DevCln::CamInter() 00114 { 00115 double b,c,dltq,t,nv; 00116 camm=1.0e+10; 00117 // calcolo il cammino verso le superfici esterne 00118 // quella cilindrica e le basi del cilindro. 00119 // scelgo il cammino positivo minore... 00120 // calcolo il cammino positivo verso la superfice del cilindro interno. 00121 // le soluzioni sono sempre di segno opposto. 00122 00123 00124 if ( vxyq>0.0 ) 00125 { 00126 b=V_dev.x*X_dev.x+V_dev.y*X_dev.y; 00127 c=drq-routq; // nota sempre negativo internamente al cilindro. 00128 if ( ( dltq=b*b-vxyq*c ) >=0.0 ) 00129 { 00130 t= ( -b + sqrt ( dltq ) ) /vxyq; // Scelgo la soluzione positiva 00131 if ( t>=0.0 ) camm=t; 00132 } 00133 } 00134 // controllo anche la zeta.... 00135 if ( ( nv=V_dev.z ) >0.0 ) // piani z 00136 {t=-Doutd.z/nv; if ( t<camm ) camm=t; } 00137 else if ( nv<0.0 ) 00138 {t=Douts.z/nv; if ( t<camm ) camm=t; } 00139 return camm; 00140 }