FlyoDoc_2011 Pisa 2011 by GmP --- 011
|
00001 /*************************************************************************** 00002 devxtax - description 00003 ------------------- 00004 begin : Sat Aug 14 2004 00005 copyright : (C) 2004 by gmp 00006 email : peppe@newpeppe 00007 *************************************************************************** 00008 * * 00009 * NA48 simulation program. * 00010 * * 00011 ***************************************************************************/ 00012 #include "parm.h" 00013 #include "devxtax.h" 00014 #include "evento.h" 00015 00016 DevXTax::DevXTax() 00017 : DevRt() 00018 { 00019 devtype=TypDevXTax; 00020 devclass="X_Tax"; 00021 //Plane versor of the hole y-walls 00022 gvet P1,P2; 00023 // 00024 Ptxup.setvn(Lin[0],Lin[1],-Lin[2]); // dx,dy,-dz 00025 Ptxdw.setvn(Lin[0],-Lin[1],-Lin[2]); // dx,-dy,-dz 00026 P1=Ptxup; P1[0]=-P1[0]; //-dx,dy,-dz 00027 P2.setvn( Fortax[0],Fortax[1],Fortax[2]); // dx,dy',dz 00028 00029 Vtxup=(Ptxup-P1)&(Ptxup-P2); 00030 Vtxup=Vtxup.NVerso(); // prodotto vettoriale normalizzato 00031 // per simmetria 00032 Vtxdw=Vtxup;Vtxdw[1]=-Vtxdw[1]; 00033 00034 /* 00035 Fortax.print("Fortax"); 00036 Ptxup.print("Ptxup"); 00037 Ptxdw.print("Ptxdw"); 00038 P1.print("P1"); 00039 P2.print("P2"); 00040 Vtxup.print("Vtxup"); 00041 Vtxdw.print("Vtxdw"); 00042 */ 00043 00044 00045 } 00046 00047 00048 DevXTax::~DevXTax() 00049 { 00050 } 00051 00052 //====================================================== 00053 //----------------- -----P o s i z i o n e --- 00054 int DevXTax::Posizione() 00055 { 00056 if( DevRt::Posizione()>0) return 1; // il punto e' esterno 00057 // il dev ha un buco centrale rettangolare che diminuisce (o cresce) in y in funzione di z 00058 // devo scalare le dimensioni y del buco secondo la z tel punto. 00059 00060 P_Cin=X_dev-Centrin; // mi riferisco al centro del buco interno 00061 ForSize=Lin; 00062 ForSize[1]=Lin[1] + 0.5*(Fortax[1]-Lin[1])*(Lin[2]+P_Cin[2])/Lin[2]; 00063 Dind=P_Cin-ForSize; 00064 Dins=-(ForSize+P_Cin); 00065 00066 if(Dins[2]>0.0 || Dind[2]>0.0 || Dins[0]>0.0 || 00067 Dind[0]>0.0 || Dins[1]>0.0 || Dind[1]>0.0 ) return 0; 00068 // ritorno -1 se il punto e' nel buco altrimento ritorno 0 00069 00070 return -1; 00071 } 00072 //----------------- -------- 00073 void DevXTax::Prgeom() 00074 { 00075 00076 Gout<<"================== R i v e l a t o r e ================="; 00077 Gout<<"\n --> < "<<nome <<" > [ "<<fun 00078 <<" ] X_tax con foro rettang variabile in y lungo z ."<<std::endl; 00079 Device::Prgeom(); 00080 Gout<<std::endl; 00081 } 00082 00083 //----------------------C a m I n t e r -------------------- 00084 00085 double DevXTax::CamInter() 00086 { 00087 //uso quella di DevRt per calcolare il cammino 00088 // interno 00089 tratto=DevRt::CamInter(); 00090 //poi verifico se colpisce le pareti del buco ..... 00091 // double nv,t; 00092 camm=-1.; 00093 // calcolo il cammino positivo verso le sei superfici del buco. Per dist>0 00094 // scelgo il cammino maggiore 00095 00096 if((nv=V_dev[0])>0.0 && Dins[0]>0.0) // piani x 00097 {t=Dins[0]/nv; if(t>camm)camm=t;} 00098 else if(nv<0.0 && Dind[0]>0.0) 00099 {t=-Dind[0]/nv; if(t>camm)camm=t;} 00100 00101 // attenzione: piano inclinato superiore 00102 nv=V_dev%Vtxup; dtxd=(Ptxup-P_Cin)%Vtxup; 00103 if(nv<0.0 && dtxd<0.0) 00104 {t=dtxd/nv; if(t>camm)camm=t;} 00105 // piano inferiore... 00106 nv=V_dev%Vtxdw; dtxd=(Ptxdw-P_Cin)%Vtxdw; 00107 if(nv<0.0 && dtxd<0.0) 00108 {t=dtxd/nv; if(t>camm)camm=t;} 00109 // 00110 if((nv=V_dev[2])>0.0 && Dins[2]>0.0) // piani z 00111 {t=Dins[2]/nv; if(t>camm)camm=t;} 00112 else if(nv<0.0 && Dind[2]>0.0) 00113 {t=-Dind[2]/nv; if(t>camm)camm=t;} 00114 00115 // quindi confronto camm con tratto e accetto il cammino piu' breve...... 00116 if(camm<0.0) {camm=tratto; return camm;} 00117 if(camm>0.0 && tratto<camm) camm=tratto; 00118 return camm; 00119 } 00120 //=============================================================== 00121 //--------------- C a m B u c o --------------------------------- 00122 double DevXTax::CamBuco() 00123 { 00124 // double nv,t; 00125 camm=1.0e+10; 00126 // calcolo il cammino verso le sei superfici 00127 // le distanze sono per definizione negative... 00128 // e scelgo il cammino positivo minore 00129 00130 00131 if((nv=V_dev[0])>0.0) // piani x 00132 {t=-Dind[0]/nv; if(t<camm)camm=t; } 00133 else if(nv<0.0) 00134 {t=Dins[0]/nv; if(t<camm)camm=t; } 00135 // piani inclinati y: superiore Vtxup,Vtxdw sono i versori 00136 // dei piani 00137 if( (nv=V_dev%Vtxup) >0.0) 00138 {dtxd=(Ptxup-P_Cin)%Vtxup; 00139 t=dtxd/nv; if(t<camm)camm=t; } 00140 // piani inclinati: inferiore 00141 if( (nv=V_dev%Vtxdw) >0.0) 00142 {dtxd=(Ptxdw-P_Cin)%Vtxdw; 00143 t=dtxd/nv; if(t<camm)camm=t; } 00144 00145 if((nv=V_dev[2])>0.0) // piani z 00146 {t=-Dind[2]/nv; if(t<camm)camm=t; } 00147 else if(nv<0.0) 00148 {t=Dins[2]/nv; if(t<camm)camm=t; } 00149 return camm; 00150 } 00151 00152 00153 00154