FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_dev/devrtcl.cpp

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