FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 DevSfera.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 "devsfera.h" 00014 #include "evento.h" 00015 00016 //using namespace std; 00017 00018 DevSfera::~DevSfera() 00019 { 00020 } 00021 //================== Sfera=======Erede di RettEdro 00022 DevSfera::DevSfera() 00023 { 00024 devtype=TypDevSfera; 00025 devclass="Sfera"; 00026 rout=Lout.z; 00027 routq=rout*rout; 00028 Lout.Norma(); 00029 Rqsize=Lout.normaq; 00030 rin=Lin.z; 00031 rinq=rin*rin; 00032 rbuco=Lin.x=Lin.y; // attenzione a definire le dimensione del buco di ingresso del beam... 00033 rbucoq=rbuco*rbuco; 00034 zbucoout= -sqrt ( routq-rbucoq ); // superficie interna del buco. 00035 zbucoin = -sqrt ( rinq-rbucoq ); // superficie interna del buco. 00036 00037 } 00038 00039 //----------------- -------- 00040 void DevSfera::Prgeom() 00041 { 00042 Gout<<"================== R i v e l a t o r e ================="; 00043 Gout<<"\n --> < "<<nome <<" > [ "<<fun 00044 <<" ] Sfera di rout "<< rout<<" cm con un buco cilin. di "<<rbuco<<" cm"; 00045 Device::Prgeom(); 00046 00047 } 00048 00049 //====================================================== 00050 //----------------- -----P o s i z i o n e --- 00051 int DevSfera::Posizione() 00052 { 00053 00054 if ( X_dev.normaq>routq ) return 1;//e' fuori 00055 00056 if ( X_dev.normaq>rinq ) // è interno tra i due gusci sferici 00057 { // è forse anche nel buco all'ingresso? 00058 if ( X_dev.z>0.0 ) return 0; // è interno nel guscio della semisfera dowstream 00059 if ( ( X_dev.x*X_dev.x+ X_dev.y*X_dev.y ) >rbucoq ) return 0;// è interno comunque anche nella semisfera upstream 00060 if ( X_dev.z<zbucoout ) return 1; // è fuori dall'ingresso upstream 00061 } 00062 return -1;// e se arivva qui è nel buco ! 00063 } 00064 //---------------------------------------------------------- 00065 //----------------------C a m E s t e r -------------------- 00066 double DevSfera::CamEster() 00067 { 00068 // calcolo il cammino positivo verso la superfice della sfera 00069 // e scelgo il cammino maggiore 00070 // calcolo i coefficienti della equazione intersezione di una retta con la sfera. 00071 camm=-1.; 00072 00073 // se mi allontano ritorno -1. 00074 00075 //con la sfera 00076 00077 double a=X_dev%V_dev; 00078 if ( a>0.0 ) return -1.; 00079 double b=X_dev.normaq-routq; 00080 double d=a*a-b; 00081 if ( d<0.0 ) return -1.; 00082 camm= -a - sqrt ( d ); 00083 // 00084 // distanza dal piano del buco di ingresso del beam 00085 if ( abs ( V_dev.z ) >0.00001 ) 00086 { 00087 double t= ( zbucoout-X_dev.z ) /V_dev.z; 00088 if ( t<0.0 ) return -1; 00089 if ( t>camm ) camm=t; 00090 } 00091 00092 return camm; 00093 } 00094 //=========================================================== 00095 //----------------------C a m I n t e r -------------------- 00096 double DevSfera::CamInter() 00097 { 00098 camm=0.01; 00099 // sono tra le due sfere 00100 double a=X_dev%V_dev; 00101 double b=X_dev.normaq-rinq; // sempre positivo 00102 double d=a*a-b; 00103 if ( a<=0.0&&d>=0.0) 00104 { // va verso la sfera interna 00105 camm= -a - sqrt ( d ); 00106 } 00107 else if ( a>0.0 ) 00108 {// dovrebbe colpire la sfera esterna 00109 b=X_dev.normaq-routq; // sempre negativo 00110 camm= -a + sqrt ( a*a-b ); // è positivo 00111 } 00112 return camm; 00113 } 00114 //=========================================================== 00115 //----------------------C a m I n t e r -------------------- 00116 double DevSfera::CamBuco() 00117 { 00118 camm=1.0e+10; 00119 // calcolo il cammino verso la superfice sferica esterna 00120 // scelgo il cammino positivo minore... 00121 // calcolo il cammino positivo verso la superfice del Sfera interno. 00122 00123 //con la sfera 00124 00125 double a=X_dev%V_dev; 00126 double b=X_dev.normaq-rinq; // sempre negativo 00127 camm= -a + sqrt ( a*a-b ); // è positivo 00128 // distanza dal piano di ingresso 00129 if ( abs ( V_dev.z ) >0.00001 ) 00130 { 00131 double t= ( zbucoout-X_dev.z ) /V_dev.z; 00132 if ( t<camm ) camm=t; 00133 } 00134 return camm; 00135 }