FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_dev/devclot.cpp

00001 /***************************************************************************
00002                           devclot.cpp  -  description
00003                              -------------------
00004     begin                : Mon Dec 8 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 "devclot.h"
00018 DevClOt::~DevClOt()
00019 {}
00020 DevClOt::DevClOt()
00021 {
00022   devtype=TypDevClOt;
00023   devclass="Cili_Ottg";
00024   Firot=.707107;
00025 }
00026 
00027 
00028 void DevClOt::Prgeom()
00029 {
00030 
00031   Gout<<"==================  R i v e l a t o r e =================";
00032   Gout<<"\n --> < "<<nome <<" >  [ "<<fun
00033   <<" ]  Cilindro con buco ottagonale "<<std::endl;
00034   Device::Prgeom();
00035 }
00036 //----------------- -----P o s i z i o n e ---
00037 int DevClOt::Posizione()
00038 {
00039   //     Posizione della particella rispetto questo dev
00040   // Le distanze di un punto interno dai piani del
00041   // rivelatore sono tutte negative o nulle data
00042   // la definizione delle normali ai piani ( verso l'esterno)
00043   // Le distanze di un punto esterno sono sia positive che negative:
00044   // ma almeno  una distanza e' positiva.
00045   // X_dev   e' la posizione  della particella rispeto al sistema del dev
00046   // Ruoto di -45 gradi il punto e lo paragono con i lati inclinati....
00047   // ripeto la stessa procedura di prima per simmetria (Lout non cambia);
00048   // double Firot=0.707107= 1/sqrt(2.);
00049   // X_rot   e' la posizione rotata di 45 gradi
00050 
00051 
00052   if( (pos=DevClRt::Posizione())>0)
00053     return 1;
00054   // pos e' 0, indica che il punto e' probabilmente interno   ..
00055   // ruoto di -45 gradi il punto e lo paragono poi anche con i lati inclinati interni....
00056   X_rot.setvn(Firot*(X_dev[0]+X_dev[1]),Firot*(X_dev[1]-X_dev[0]), X_dev[2]);
00057   Dinrd=X_rot-Lin;
00058   Dinrs=-(Lin+X_rot);
00059 
00060   //Test now
00061   if(pos==0)
00062     return 0;
00063   if(Dinrs[0]>0.0 ||
00064       Dinrd[0]>0.0 || Dinrs[1]>0.0 || Dinrd[1]>0.0   )
00065     return 0;
00066   return -1;     // 0 se interno, 1 se esterno.
00067 
00068 }
00069 //----------------------C a m E s t e r --------------------
00070 // calcola il cammino esterno per raggiungere il rivelatore...
00071 // eridata da DevCl::CamEster()
00072 
00073 //----------------------C a m I n t e r --------------------
00074 // calcola il cammino interno per uscire dal rivelatore...
00075 // vedi la routine nella classe base rettangolo.
00076 // V_dev e' il versore della traiettoria nel dev
00077 // V_rot e' il versore ruotato di 45 gradi per i lati inclinati
00078 //
00079 double DevClOt::CamInter()
00080 {
00081   // calcolo il cammino verso le  superfici del cilindro
00082   // e  quattro dei lati dell'ottagono
00083   // le distanze sono per definizione negative...
00084   // e scelgo il cammino positivo  maggiore
00085   // camm in uscita e' sempre definito
00086   // prima la classe base....
00087   tratto=DevClRt::CamInter();
00088 
00089   // roto di 45 gradi per controllare il moto rispetto ai piani inclinati...
00090   V_rot.setvn(Firot*(V_dev[0]+V_dev[1]),Firot*(V_dev[1]-V_dev[0]), V_dev[2]);
00091 
00092   //poi verifico se colpisce le pareti del buco .....
00093   double nv,t;
00094   camm=-1.;
00095   // calcolo il cammino positivo verso le sei superfici del buco. Per dist>0
00096   // scelgo il cammino maggiore
00097 
00098   if((nv=V_rot[0])>0.0 && Dinrs[0]>0.0)  // piani x
00099     {t=Dinrs[0]/nv;
00100       if(t>camm)
00101         camm=t;
00102     }
00103   else if(nv<0.0 && Dinrd[0]>0.0)
00104     {
00105       t=-Dinrd[0]/nv;
00106       if(t>camm)
00107         camm=t;
00108     }
00109 
00110   if((nv=V_rot[1])>0.0 && Dinrs[1]>0.0)  // piani y
00111     {t=Dinrs[1]/nv;
00112       if(t>camm)
00113         camm=t;
00114     }
00115   else if(nv<0.0 && Dinrd[1]>0.0)
00116     {
00117       t=-Dinrd[1]/nv;
00118       if(t>camm)
00119         camm=t;
00120     }
00121 
00122   if((nv=V_rot[2])>0.0 && Dinrs[2]>0.0)  // piani z
00123     {t=Dinrs[2]/nv;
00124       if(t>camm)
00125         camm=t;
00126     }
00127   else if(nv<0.0 && Dinrd[2]>0.0)
00128     {
00129       t=-Dinrd[2]/nv;
00130       if(t>camm)
00131         camm=t;
00132     }
00133 
00134   // quindi confronto camm con tratto e accetto il cammino piu' breve......
00135   if(camm<0.0)
00136     {
00137       camm=tratto;
00138       return camm;
00139     }
00140   if(camm>0.0 && tratto<camm)
00141     camm=tratto;
00142   return camm;
00143 }
00144 //=========================================
00145 //===============================================================
00146 //--------------- C a m B u c o ---------------------------------
00147 double DevClOt::CamBuco()
00148 {
00149 
00150   // simile a (copia di)   DevOtOt::CamBuco();
00151 
00152   double nv,t;
00153   camm=1.0e+10;
00154   // calcolo il cammino verso le otto+2  superfici
00155   // le distanze sono per definizione negative...
00156   // e scelgo il cammino positivo  minore
00157 
00158 
00159   if((nv=V_dev[0])>0.0)  // piani x
00160     {t=-Dind[0]/nv;
00161       if(t<camm)
00162         camm=t;
00163     }
00164   else if(nv<0.0)
00165     {
00166       t=Dins[0]/nv;
00167       if(t<camm)
00168         camm=t;
00169     }
00170 
00171   if((nv=V_dev[1])>0.0)  // piani y
00172     {t=-Dind[1]/nv;
00173       if(t<camm)
00174         camm=t;
00175     }
00176   else if(nv<0.0)
00177     {
00178       t=Dins[1]/nv;
00179       if(t<camm)
00180         camm=t;
00181     }
00182 
00183   if((nv=V_dev[2])>0.0)  // piani z
00184     {t=-Dind[2]/nv;
00185       if(t<camm)
00186         camm=t;
00187     }
00188   else if(nv<0.0)
00189     {
00190       t=Dins[2]/nv;
00191       if(t<camm)
00192         camm=t;
00193     }
00194 
00195   // roto di 45 gradi per controllare il moto rispetto ai piani inclinati...
00196   V_rot.setvn(Firot*(V_dev[0]+V_dev[1]),Firot*(V_dev[1]-V_dev[0]), V_dev[2]);
00197 
00198   if((nv=V_rot[0])>0.0)  // piani x
00199     {t=-Dinrd[0]/nv;
00200       if(t<camm)
00201         camm=t;
00202     }
00203   else if(nv<0.0)
00204     {
00205       t=Dinrs[0]/nv;
00206       if(t<camm)
00207         camm=t;
00208     }
00209 
00210   if((nv=V_rot[1])>0.0)  // piani y
00211     {t=-Dinrd[1]/nv;
00212       if(t<camm)
00213         camm=t;
00214     }
00215   else if(nv<0.0)
00216     {
00217       t=Dinrs[1]/nv;
00218       if(t<camm)
00219         camm=t;
00220     }
00221 
00222   return camm;
00223 }
 All Classes Namespaces Files Functions Variables