FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 devclot.cpp - description 00003 ------------------- 00004 begin : Mon Dec 8 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 "devclot.h" 00018 DevClOt::~DevClOt() 00019 {} 00020 DevClOt::DevClOt() 00021 { 00022 devtype=TypDevClOt; 00023 devclass="Cili_Ottg"; 00024 Firot=.707107; 00025 } 00026 00027 00028 void DevClOt::Prgeom() 00029 { 00030 00031 Gout<<"================== R i v e l a t o r e ================="; 00032 Gout<<"\n --> < "<<nome <<" > [ "<<fun 00033 <<" ] Cilindro con buco ottagonale "<<std::endl; 00034 Device::Prgeom(); 00035 } 00036 //----------------- -----P o s i z i o n e --- 00037 int DevClOt::Posizione() 00038 { 00039 // Posizione della particella rispetto questo dev 00040 // Le distanze di un punto interno dai piani del 00041 // rivelatore sono tutte negative o nulle data 00042 // la definizione delle normali ai piani ( verso l'esterno) 00043 // Le distanze di un punto esterno sono sia positive che negative: 00044 // ma almeno una distanza e' positiva. 00045 // X_dev e' la posizione della particella rispeto al sistema del dev 00046 // Ruoto di -45 gradi il punto e lo paragono con i lati inclinati.... 00047 // ripeto la stessa procedura di prima per simmetria (Lout non cambia); 00048 // double Firot=0.707107= 1/sqrt(2.); 00049 // X_rot e' la posizione rotata di 45 gradi 00050 00051 00052 if( (pos=DevClRt::Posizione())>0) 00053 return 1; 00054 // pos e' 0, indica che il punto e' probabilmente interno .. 00055 // ruoto di -45 gradi il punto e lo paragono poi anche con i lati inclinati interni.... 00056 X_rot.setvn(Firot*(X_dev[0]+X_dev[1]),Firot*(X_dev[1]-X_dev[0]), X_dev[2]); 00057 Dinrd=X_rot-Lin; 00058 Dinrs=-(Lin+X_rot); 00059 00060 //Test now 00061 if(pos==0) 00062 return 0; 00063 if(Dinrs[0]>0.0 || 00064 Dinrd[0]>0.0 || Dinrs[1]>0.0 || Dinrd[1]>0.0 ) 00065 return 0; 00066 return -1; // 0 se interno, 1 se esterno. 00067 00068 } 00069 //----------------------C a m E s t e r -------------------- 00070 // calcola il cammino esterno per raggiungere il rivelatore... 00071 // eridata da DevCl::CamEster() 00072 00073 //----------------------C a m I n t e r -------------------- 00074 // calcola il cammino interno per uscire dal rivelatore... 00075 // vedi la routine nella classe base rettangolo. 00076 // V_dev e' il versore della traiettoria nel dev 00077 // V_rot e' il versore ruotato di 45 gradi per i lati inclinati 00078 // 00079 double DevClOt::CamInter() 00080 { 00081 // calcolo il cammino verso le superfici del cilindro 00082 // e quattro dei lati dell'ottagono 00083 // le distanze sono per definizione negative... 00084 // e scelgo il cammino positivo maggiore 00085 // camm in uscita e' sempre definito 00086 // prima la classe base.... 00087 tratto=DevClRt::CamInter(); 00088 00089 // roto di 45 gradi per controllare il moto rispetto ai piani inclinati... 00090 V_rot.setvn(Firot*(V_dev[0]+V_dev[1]),Firot*(V_dev[1]-V_dev[0]), V_dev[2]); 00091 00092 //poi verifico se colpisce le pareti del buco ..... 00093 double nv,t; 00094 camm=-1.; 00095 // calcolo il cammino positivo verso le sei superfici del buco. Per dist>0 00096 // scelgo il cammino maggiore 00097 00098 if((nv=V_rot[0])>0.0 && Dinrs[0]>0.0) // piani x 00099 {t=Dinrs[0]/nv; 00100 if(t>camm) 00101 camm=t; 00102 } 00103 else if(nv<0.0 && Dinrd[0]>0.0) 00104 { 00105 t=-Dinrd[0]/nv; 00106 if(t>camm) 00107 camm=t; 00108 } 00109 00110 if((nv=V_rot[1])>0.0 && Dinrs[1]>0.0) // piani y 00111 {t=Dinrs[1]/nv; 00112 if(t>camm) 00113 camm=t; 00114 } 00115 else if(nv<0.0 && Dinrd[1]>0.0) 00116 { 00117 t=-Dinrd[1]/nv; 00118 if(t>camm) 00119 camm=t; 00120 } 00121 00122 if((nv=V_rot[2])>0.0 && Dinrs[2]>0.0) // piani z 00123 {t=Dinrs[2]/nv; 00124 if(t>camm) 00125 camm=t; 00126 } 00127 else if(nv<0.0 && Dinrd[2]>0.0) 00128 { 00129 t=-Dinrd[2]/nv; 00130 if(t>camm) 00131 camm=t; 00132 } 00133 00134 // quindi confronto camm con tratto e accetto il cammino piu' breve...... 00135 if(camm<0.0) 00136 { 00137 camm=tratto; 00138 return camm; 00139 } 00140 if(camm>0.0 && tratto<camm) 00141 camm=tratto; 00142 return camm; 00143 } 00144 //========================================= 00145 //=============================================================== 00146 //--------------- C a m B u c o --------------------------------- 00147 double DevClOt::CamBuco() 00148 { 00149 00150 // simile a (copia di) DevOtOt::CamBuco(); 00151 00152 double nv,t; 00153 camm=1.0e+10; 00154 // calcolo il cammino verso le otto+2 superfici 00155 // le distanze sono per definizione negative... 00156 // e scelgo il cammino positivo minore 00157 00158 00159 if((nv=V_dev[0])>0.0) // piani x 00160 {t=-Dind[0]/nv; 00161 if(t<camm) 00162 camm=t; 00163 } 00164 else if(nv<0.0) 00165 { 00166 t=Dins[0]/nv; 00167 if(t<camm) 00168 camm=t; 00169 } 00170 00171 if((nv=V_dev[1])>0.0) // piani y 00172 {t=-Dind[1]/nv; 00173 if(t<camm) 00174 camm=t; 00175 } 00176 else if(nv<0.0) 00177 { 00178 t=Dins[1]/nv; 00179 if(t<camm) 00180 camm=t; 00181 } 00182 00183 if((nv=V_dev[2])>0.0) // piani z 00184 {t=-Dind[2]/nv; 00185 if(t<camm) 00186 camm=t; 00187 } 00188 else if(nv<0.0) 00189 { 00190 t=Dins[2]/nv; 00191 if(t<camm) 00192 camm=t; 00193 } 00194 00195 // roto di 45 gradi per controllare il moto rispetto ai piani inclinati... 00196 V_rot.setvn(Firot*(V_dev[0]+V_dev[1]),Firot*(V_dev[1]-V_dev[0]), V_dev[2]); 00197 00198 if((nv=V_rot[0])>0.0) // piani x 00199 {t=-Dinrd[0]/nv; 00200 if(t<camm) 00201 camm=t; 00202 } 00203 else if(nv<0.0) 00204 { 00205 t=Dinrs[0]/nv; 00206 if(t<camm) 00207 camm=t; 00208 } 00209 00210 if((nv=V_rot[1])>0.0) // piani y 00211 {t=-Dinrd[1]/nv; 00212 if(t<camm) 00213 camm=t; 00214 } 00215 else if(nv<0.0) 00216 { 00217 t=Dinrs[1]/nv; 00218 if(t<camm) 00219 camm=t; 00220 } 00221 00222 return camm; 00223 }