FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 devot.cpp - description 00003 ------------------- 00004 begin : Sat Dec 6 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 "devot.h" 00014 #include "particella.h" 00015 00016 DevOt::DevOt() 00017 { 00018 devtype=TypDevOt; 00019 devclass="Ottagon"; 00020 Firot=.707107; 00021 }; 00022 DevOt::~DevOt() 00023 { 00024 } 00025 00026 00027 void DevOt::Prgeom() 00028 { 00029 00030 Gout<<"================== R i v e l a t o r e ================="; 00031 Gout<<"\n --> < "<<nome <<" > [ "<<fun 00032 <<" ] ottagonale senza buco "<<std::endl; 00033 Device::Prgeom(); 00034 } 00035 //----------------- -----P o s i z i o n e --- 00036 int DevOt::Posizione() 00037 { 00038 // Posizione della particella rispetto questo dev 00039 // Le distanze di un punto interno dai piani del 00040 // rivelatore sono tutte negative o nulle data 00041 // la definizione delle normali ai piani ( verso l'esterno) 00042 // Le distanze di un punto esterno sono sia positive che negative: 00043 // ma almeno una distanza e' positiva. 00044 // X_dev e' la posizione della particella rispeto al sistema del dev 00045 // Ruoto di -45 gradi il punto e lo paragono con i lati inclinati.... 00046 // ripeto la stessa procedura di prima per simmetria (Lout non cambia); 00047 // double Firot=0.707107= 1/sqrt(2.); 00048 // X_rot e' la posizione rotata di 45 gradi 00049 00050 X_rot.setvn ( Firot* ( X_dev[0]+X_dev[1] ),Firot* ( X_dev[1]-X_dev[0] ), X_dev[2] ); 00051 Doutrd=X_rot-Lout; 00052 Doutrs=- ( Lout+X_rot ); 00053 00054 //Test now 00055 if ( DevRt::Posizione() >0 ) return 1; 00056 if ( Doutrs[0]>0.0 || 00057 Doutrd[0]>0.0 || Doutrs[1]>0.0 || Doutrd[1]>0.0 ) return 1; 00058 00059 return 0; // 0 se interno, 1 se esterno. Il buco qui non c'e'. 00060 00061 } 00062 //---------------------------------------------------------- 00063 //----------------------C a m E s t e r -------------------- 00064 // calcola il cammino esterno per raggiungere il rivelatore... 00065 // vedi la routine nella classe base rettangolo. 00066 // V_dev e' il versore della traiettoria nel dev 00067 // V_rot e' il versore ruotato di 45 gradi per i lati inclinati 00068 // 00069 double DevOt::CamEster() 00070 { 00071 double nv,t; 00072 // test sulla classe base 00073 camm=DevRt::CamEster(); 00074 00075 /* 00076 Doutd.print("doutd"); 00077 Douts.print("douts"); 00078 Doutrd.print("doutrd"); 00079 Doutrs.print("doutrs"); 00080 */ 00081 00082 // roto di 45 gradi per controllare il moto rispetto ai piani inclinati... 00083 V_rot.setvn ( Firot* ( V_dev[0]+V_dev[1] ),Firot* ( V_dev[1]-V_dev[0] ), V_dev[2] ); 00084 00085 if ( ( nv=V_rot[0] ) >0.0 && Doutrs[0]>0.0 ) // piani x inclinati 00086 {t=Doutrs[0]/nv; if ( t>camm ) camm=t;} 00087 else if ( nv<0.0 && Doutrd[0]>0.0 ) 00088 {t=-Doutrd[0]/nv;if ( t>camm ) camm=t;} 00089 00090 00091 00092 if ( ( nv=V_rot[1] ) >0.0 && Doutrs[1]>0.0 ) // piani y inclinati 00093 { 00094 t=Doutrs[1]/nv;if ( t>camm ) camm=t; 00095 } 00096 else if ( nv<0.0 && Doutrd[1]>0.0 ) 00097 {t=-Doutrd[1]/nv;if ( t>camm ) camm=t;} 00098 00099 return camm; 00100 } 00101 00102 //----------------------C a m I n t e r -------------------- 00103 // calcola il cammino interno per uscire dal rivelatore... 00104 // vedi la routine nella classe base rettangolo. 00105 // V_dev e' il versore della traiettoria nel dev 00106 // V_rot e' il versore ruotato di 45 gradi per i lati inclinati 00107 // 00108 double DevOt::CamInter() 00109 { 00110 double nv,t; 00111 // calcolo il cammino verso le otto +2 superfici 00112 // le distanze sono per definizione negative... 00113 // e scelgo il cammino positivo maggiore 00114 // camm in uscita e' sempre definito 00115 // prima la classe base.... 00116 camm=DevRt::CamInter(); 00117 00118 // roto di 45 gradi per controllare il moto rispetto ai piani inclinati... 00119 V_rot.setvn ( Firot* ( V_dev[0]+V_dev[1] ),Firot* ( V_dev[1]-V_dev[0] ), V_dev[2] ); 00120 00121 if ( ( nv=V_rot[0] ) >0.0 ) // piani x rotato 00122 {t=-Doutrd[0]/nv; if ( t<camm ) camm=t; } 00123 else if ( nv<0.0 ) 00124 {t=Doutrs[0]/nv; if ( t<camm ) camm=t; } 00125 if ( ( nv=V_rot[1] ) >0.0 ) // piani y rotato 00126 {t=-Doutrd[1]/nv; if ( t<camm ) camm=t; } 00127 else if ( nv<0.0 ) 00128 {t=Doutrs[1]/nv; if ( t<camm ) camm=t; } 00129 00130 return camm; 00131 } 00132 00133 00134 00135 00136 00137 00138 00139 00140 00141 00142 00143 00144 00145 00146