FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 devotot.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 "devotot.h" 00014 00015 DevOtOt::~DevOtOt(){ 00016 } 00017 00018 00019 //================== DevOtOt ======Erede di DevOt 00020 DevOtOt::DevOtOt() 00021 { 00022 devtype=TypDevOtOt; 00023 devclass="Ottg_Ottg"; 00024 } 00025 00026 //----------------- -------- 00027 void DevOtOt::Prgeom() 00028 { 00029 00030 Gout<<"================== R i v e l a t o r e ================="; 00031 Gout<<"\n --> < "<<nome <<" > [ "<<fun 00032 <<" ] Ottagonale con buco ottagonale "<<std::endl; 00033 Device::Prgeom(); 00034 } 00035 00036 //====================================================== 00037 //----------------- -----P o s i z i o n e --- 00038 int DevOtOt::Posizione() 00039 { 00040 00041 if( DevOt::Posizione()>0) return 1; // il punto e' esterno 00042 00043 // se sono interno al rivelatore verifico se siamo nel buco 00044 00045 P_Cin=X_dev-Centrin; // mi riferisco al centro del buco interno 00046 Dind=P_Cin-Lin; 00047 Dins=-(Lin+P_Cin); 00048 00049 // ruoto di -45 gradi il punto e lo paragono con i lati inclinati.... 00050 // ripeto la stessa procedura di prima per simmetria (Lout non cambia); 00051 //double Firot=0.707107= 1/sqrt(2.); 00052 00053 P_Crot.setvn(Firot*(P_Cin[0]+P_Cin[1]),Firot*(P_Cin[1]-P_Cin[0]), P_Cin[2]); 00054 Dinrd=P_Crot-Lin; 00055 Dinrs=-(Lin+P_Crot); // l'operatore unario "-" funge.... 00056 00057 // Test now 00058 00059 if(Dins[2]>0.0 || Dind[2]>0.0 || Dins[0]>0.0 || 00060 Dind[0]>0.0 || Dins[1]>0.0 || Dind[1]>0.0 ) return 0; 00061 00062 if(Dinrs[0]>0.0 || 00063 Dinrd[0]>0.0 || Dinrs[1]>0.0 || Dinrd[1]>0.0 ) return 0; 00064 // ritorno -1 perche' nel buco 00065 return -1; 00066 } 00067 //----------------------C a m E s t e r -------------------- 00068 // usa quella di DevOt per eredita' 00069 //=========================================================== 00070 //----------------------C a m I n t e r -------------------- 00071 00072 double DevOtOt::CamInter() 00073 { 00074 //uso quella di DevRt per calcolare il cammino 00075 // interno senza il buco... 00076 double tratto=DevOt::CamInter(); 00078 double nv,t; 00079 camm=-1.; 00080 // calcolo il cammino positivo verso le otto+2 superfici del buco. Per dist>0 00081 // scelgo il cammino maggiore 00082 00083 if((nv=V_dev[0])>0.0 && Dins[0]>0.0) // piani x 00084 {t=Dins[0]/nv; if(t>camm)camm=t;} 00085 else if(nv<0.0 && Dind[0]>0.0) 00086 {t=-Dind[0]/nv; if(t>camm)camm=t;} 00087 if((nv=V_dev[1])>0.0 && Dins[1]>0.0) // piani y 00088 {t=Dins[1]/nv; if(t>camm)camm=t;} 00089 else if(nv<0.0 && Dind[1]>0.0) 00090 {t=-Dind[1]/nv; if(t>camm)camm=t;} 00091 if((nv=V_dev[2])>0.0 && Dins[2]>0.0) // piani z 00092 {t=Dins[2]/nv; if(t>camm)camm=t;} 00093 else if(nv<0.0 && Dind[2]>0.0) 00094 {t=-Dind[2]/nv; if(t>camm)camm=t;} 00095 00096 // roto di 45 gradi per controllare il moto rispetto ai piani inclinati... 00097 V_rot.setvn(Firot*(V_dev[0]+V_dev[1]),Firot*(V_dev[1]-V_dev[0]), V_dev[2]); 00098 00099 if((nv=V_rot[0])>0.0 && Dinrs[0]>0.0) // piani x 00100 {t=Dinrs[0]/nv; if(t>camm)camm=t;} 00101 else if(nv<0.0 && Dinrd[0]>0.0) 00102 {t=-Dinrd[0]/nv; if(t>camm)camm=t;} 00103 if((nv=V_rot[1])>0.0 && Dinrs[1]>0.0) // piani y 00104 {t=Dinrs[1]/nv; if(t>camm)camm=t;} 00105 else if(nv<0.0 && Dind[1]>0.0) 00106 {t=-Dinrd[1]/nv; if(t>camm)camm=t;} 00107 // test su zeta non serve 00108 00109 // quindi confronto camm con tratto e accetto il cammino piu' breve...... 00110 if(camm<0.0) {camm=tratto; return camm;} 00111 if(camm>0.0 && tratto<camm) camm=tratto; 00112 return camm; 00113 } 00114 //=============================================================== 00115 //--------------- C a m B u c o --------------------------------- 00116 double DevOtOt::CamBuco() 00117 { 00118 double nv,t; 00119 camm=1.0e+10; 00120 // calcolo il cammino verso le otto+2 superfici 00121 // le distanze sono per definizione negative... 00122 // e scelgo il cammino positivo minore 00123 00124 00125 if((nv=V_dev[0])>0.0) // piani x 00126 {t=-Dind[0]/nv; if(t<camm)camm=t; } 00127 else if(nv<0.0) 00128 {t=Dins[0]/nv; if(t<camm)camm=t; } 00129 00130 if((nv=V_dev[1])>0.0) // piani y 00131 {t=-Dind[1]/nv; if(t<camm)camm=t; } 00132 else if(nv<0.0) 00133 {t=Dins[1]/nv; if(t<camm)camm=t; } 00134 00135 if((nv=V_dev[2])>0.0) // piani z 00136 {t=-Dind[2]/nv; if(t<camm)camm=t; } 00137 else if(nv<0.0) 00138 {t=Dins[2]/nv; if(t<camm)camm=t; } 00139 00140 // roto di 45 gradi per controllare il moto rispetto ai piani inclinati... 00141 V_rot.setvn(Firot*(V_dev[0]+V_dev[1]),Firot*(V_dev[1]-V_dev[0]), V_dev[2]); 00142 00143 if((nv=V_rot[0])>0.0) // piani x 00144 {t=-Dinrd[0]/nv; if(t<camm)camm=t; } 00145 else if(nv<0.0) 00146 {t=Dinrs[0]/nv; if(t<camm)camm=t; } 00147 00148 if((nv=V_rot[1])>0.0) // piani y 00149 {t=-Dinrd[1]/nv; if(t<camm)camm=t; } 00150 else if(nv<0.0) 00151 {t=Dinrs[1]/nv; if(t<camm)camm=t; } 00152 00153 if((nv=V_rot[2])>0.0) // piani y 00154 {t=-Dinrd[2]/nv; if(t<camm)camm=t; } 00155 else if(nv<0.0) 00156 {t=Dinrs[2]/nv; if(t<camm)camm=t; } 00157 00158 00159 00160 00161 return camm; 00162 }