FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_dev/devcln.cpp

00001 /***************************************************************************
00002                           devcln.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 "devcln.h"
00014 #include "evento.h"
00015 
00016 //using namespace std;
00017 
00018 DevCln::~DevCln()
00019 {
00020 }
00021 //==================  Cilindro=======Erede di RettEdro
00022 DevCln::DevCln()
00023 {
00024   devtype=TypDevCln;
00025   devclass="Cilindro";
00026   rout=Lout.y=Lout.x;  // simmetrizzo le coordinate x,y Lout.x sempre differente da 0 e = rout;
00027   routq=rout*rout;
00028   Lout.Norma();
00029   Rqsize=Lout.normaq;
00030 
00031 }
00032 
00033 //----------------- --------
00034 void DevCln::Prgeom()
00035 {
00036   Gout<<"==================  R i v e l a t o r e =================";
00037   Gout<<"\n --> < "<<nome <<" >  [ "<<fun
00038   <<" ]  Cilindro di rout "<< rout<<"  senza buco. ";
00039   Device::Prgeom();
00040 
00041 }
00042 
00043 //======================================================
00044 //----------------- -----P o s i z i o n e ---
00045 int DevCln::Posizione()
00046 {
00047   
00048 //  Doutd=X_dev-Lout;     Doutd.Norma();
00049 //  Douts= - ( Lout+X_dev );  Douts.Norma();
00050 
00051   Doutd.z=X_dev.z-Lout.z;   //solo la componente z
00052   // Distanze dai piani dispari in Douts (per differenza).
00053   Douts.z=  - ( Lout.z+X_dev.z );   // l'operatore unario "-" funge....
00054 
00055   if ( X_dev.normaq>Rqsize ) return 1;
00056 
00057   drq= X_dev.x*X_dev.x+ X_dev.y*X_dev.y;
00058   vxyq=V_dev.x*V_dev.x+V_dev.y*V_dev.y;   // per futuro uso
00059   if ( Douts.z>0.0 || Doutd.z>0.0 || drq>routq ) return 1; //e' fouri
00060   return 0;    // zero se interno, 1 se esterno.
00061 
00062 
00063 }
00064 //----------------------------------------------------------
00065 //----------------------C a m E s t e r --------------------
00066 double DevCln::CamEster()
00067 {
00068   double b,c,dltq,t,nv;
00069 // calcolo il cammino positivo verso la  superfice del cilindro.
00070 // e scelgo il cammino maggiore
00071 // calcolo i coefficienti della equazione intersezione di una retta con cil
00072   camm=-1.;
00073 
00074 // se mi allontano  ritorno -1.
00075 
00076 
00077   if ( ( nv=V_dev.z ) >0.0&&Doutd.z>0.0 )return -1.;
00078 
00079 
00080 
00081 // *****   controllo se colpisce una delle  basi
00082 
00083   if ( nv >0.0 && Douts.z>0.0 )  // piani z
00084     {t=Douts.z/nv;  if ( t>camm ) camm=t;}
00085   else if ( nv<0.0 && Doutd.z>0.0 )
00086     {t=-Doutd.z/nv; if ( t>camm ) camm=t;}
00087 
00088 // non ha colpito la base ...
00089 //   ora verifico se colpisce il lato nei limiti di zeta...
00090 //  revised  31.07.01 gmp
00091 
00092 
00093   if ( vxyq<=0.0 ) return camm; //per vxyq==0 corre lungo zeta /vedi Posizione()
00094   double z=0.;
00095   b=V_dev.x*X_dev.x+V_dev.y*X_dev.y;
00096   if ( b>0. )  return camm;
00097   c=drq-routq;
00098   if ( ( dltq=b*b-vxyq*c ) <0.0 ) return camm;
00099   t= - ( b + sqrt ( dltq ) ) /vxyq; // Scelgo la soluzione minore
00100   if ( t>=0.0 )
00101   {
00102     // check limiti in zeta
00103     z=X_dev.z+nv*t;
00104     if ( -Lout.z<=z&&z<=Lout.z ) camm=t;
00105   }
00106 //***********
00107 //    if ( pr_dev->Get_Idm()==14 ) SpiaPr ( " Ester2 ", 49,49,camm );
00108   return camm;
00109 }
00110 //===========================================================
00111 //----------------------C a m I n t e r --------------------
00112 
00113 double DevCln::CamInter()
00114 {
00115   double b,c,dltq,t,nv;
00116   camm=1.0e+10;
00117 // calcolo il cammino verso le  superfici esterne
00118 // quella cilindrica e le basi del cilindro.
00119 // scelgo il cammino positivo minore...
00120 // calcolo il cammino positivo verso la superfice del cilindro interno.
00121 // le soluzioni sono sempre di segno opposto.
00122 
00123 
00124   if ( vxyq>0.0 )
00125   {
00126     b=V_dev.x*X_dev.x+V_dev.y*X_dev.y;
00127     c=drq-routq;           // nota sempre negativo internamente al cilindro.
00128     if ( ( dltq=b*b-vxyq*c ) >=0.0 )
00129     {
00130       t= ( -b + sqrt ( dltq ) ) /vxyq; // Scelgo la soluzione positiva
00131       if ( t>=0.0 ) camm=t;    
00132     }
00133   }
00134 // controllo anche la zeta....
00135   if ( ( nv=V_dev.z ) >0.0 )  // piani z
00136     {t=-Doutd.z/nv; if ( t<camm ) camm=t; }
00137   else if ( nv<0.0 )
00138     {t=Douts.z/nv;  if ( t<camm ) camm=t; }
00139   return camm;
00140 }
 All Classes Namespaces Files Functions Variables