FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_dev/devotcl.cpp

00001 /***************************************************************************
00002                           devotcl.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 "devotcl.h"
00014 #include "devrtcl.h"
00015 
00016 DevOtCl::~DevOtCl()
00017 {
00018 }
00019 
00020 
00021 //================== DevOtCl ======Erede di DevOt
00022 DevOtCl::DevOtCl()
00023 {
00024   devtype=TypDevOtCl;
00025   devclass="Ottg_Cili";
00026   rin = Lin[1]=Lin[0];
00027   Lin.Norma();
00028   rinq=rin*rin;
00029 }
00030 
00031 //----------------- --------
00032 void DevOtCl::Prgeom()
00033 {
00034 
00035   Gout<<"==================  R i v e l a t o r e =================";
00036   Gout<<"\n --> < "<<nome <<" >  [ "<<fun
00037   <<" ]  Ottagonale con buco cilindrico  "<<std::endl;
00038   Device::Prgeom();
00039   Gout<<std::endl;
00040 }
00041 
00042 //======================================================
00043 //----------------- -----P o s i z i o n e ---
00044 int DevOtCl::Posizione()
00045 {
00046   if ( DevOt::Posizione() >0 ) return 1;
00047 // puo' essere interno o nel buco
00048   P_Cin=X_dev-Centrin;
00049   Dind=P_Cin-Lin;
00050   Dins=- ( Lin+P_Cin );
00051 // se sono interno al rivelatore verifico se siamo nel buco
00052   if ( ( drinq= P_Cin[0]*P_Cin[0]+P_Cin[1]*P_Cin[1] ) >rinq ) return 0;
00053 //  sono forse nel buco ...controllo meglio i limiti
00054 // in zeta. Ricordo Lin[2] e' la zeta della base destra...
00055   if ( P_Cin[2]< -Lin[2] || P_Cin[2]> Lin[2] ) return 0; // e' esterno
00056 // ritorno -1  perche' nel buco
00057   return -1;
00058 }
00059 //----------------------C a m E s t e r --------------------
00060 // usa quella di DevOt  per eredita'
00061 //===========================================================
00062 //----------------------C a m I n t e r --------------------
00063 
00064 double DevOtCl::CamInter()
00065 {
00066 //uso quella di DevRt per calcolare il cammino
00067 // interno senza il buco...
00068   double tratto=DevOt::CamInter();
00069 //poi verifico se colpisce le pareti del buco .....
00070   double a,b,c,dltq,t,nv,z;
00071 // calcolo il cammino positivo verso le  superfici del cilindro interno.
00072 // e scelgo il cammino maggiore
00073 //  calcolo i coefficienti della equazione intersezione di una retta con cili
00074   camm=-1.;
00075 // controllo se colpisce la base
00076   if ( ( nv=V_dev[2] ) >0.0 && Dins[2]>0.0 )  // piani z
00077     {t=Dins[2]/nv;  if ( t>camm ) camm=t;}
00078   else if ( nv<0.0 && Dind[2]>0.0 )
00079     {t=-Dind[2]/nv; if ( t>camm ) camm=t;}
00080 //
00081   a=V_dev[0]*V_dev[0]+V_dev[1]*V_dev[1];
00082   if ( a>0.0 )  //revised 31.07.01 gmp
00083   {
00084     b=V_dev[0]*P_Cin[0]+V_dev[1]*P_Cin[1];
00085     if ( b<0. )
00086     {
00087       c=drinq-rinq;
00088       if ( ( dltq=b*b-a*c ) >=0.0 )
00089       {
00090         t= - ( b + sqrt ( dltq ) ) /a; // Scelgo la soluzione minore
00091         if ( t>=0.0 )
00092         {
00093           // check limiti in zeta
00094           z=P_Cin[2]+nv*t;
00095           if ( -Lin[2]<=z&&z<=Lin[2] ) camm=t;
00096         }
00097       }
00098     }
00099   }
00100   // quindi confronto camm con tratto e accetto il cammino piu' breve......
00101   if ( camm<0.0 ) {camm=tratto; return camm;}
00102   if ( camm>0.0 && tratto<camm ) camm=tratto;
00103   return camm;
00104 }
00105 //===============================================================
00106 //--------------- C a m B u c o ---------------------------------
00107 double DevOtCl::CamBuco()
00108 {
00109 
00110   double a,b,c,dltq,t,nv;
00111   camm=1.0e+10;
00112 // calcolo il cammino verso le  superfici
00113 // quella cilindrica e dalle basi del cilindro.
00114 // scelgo il cammino positivo minore...
00115 // calcolo il cammino positivo verso la superfice del cilindro interno.
00116 // le soluzioni sono sempre di segno opposto.
00117   a=V_dev[0]*V_dev[0]+V_dev[1]*V_dev[1];
00118   if ( a>0.0 )
00119   {
00120     b=V_dev[0]*P_Cin[0]+V_dev[1]*P_Cin[1];
00121     c=drinq-rinq;           // nota sempre negativo internamente al cilindro.
00122     if ( ( dltq=b*b-a*c ) >=0.0 )
00123     {
00124       t= ( -b + sqrt ( dltq ) ) /a; // Scelgo la soluzione positiva
00125       if ( t>=0.0 ) camm=t;
00126     }
00127   }
00128 // controllo anche la zeta....
00129   if ( ( nv=V_dev[2] ) >0.0 )  // piani z
00130     {t=-Dind[2]/nv; if ( t<camm ) camm=t; }
00131   else if ( nv<0.0 )
00132     {t=Dins[2]/nv;  if ( t<camm ) camm=t; }
00133   return camm;
00134 
00135 }
00136 
 All Classes Namespaces Files Functions Variables