FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_dev/devcrn.cpp

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