FlyoDoc_2011 Pisa 2011 by GmP --- 011

flyopunta/src/src_dev/devxtax.cpp

00001 /***************************************************************************
00002                           devxtax  -  description
00003                              -------------------
00004     begin                : Sat Aug 14 2004
00005     copyright            : (C) 2004 by gmp
00006     email                : peppe@newpeppe
00007   ***************************************************************************
00008   *                                                                         *
00009   *   NA48  simulation program.                                             *
00010   *                                                                         *
00011   ***************************************************************************/
00012 #include "parm.h"
00013 #include "devxtax.h"
00014 #include "evento.h"
00015 
00016 DevXTax::DevXTax()
00017  : DevRt()
00018 {
00019   devtype=TypDevXTax;
00020   devclass="X_Tax";
00021 //Plane versor  of the hole y-walls
00022   gvet P1,P2; 
00023 //  
00024   Ptxup.setvn(Lin[0],Lin[1],-Lin[2]);         // dx,dy,-dz
00025   Ptxdw.setvn(Lin[0],-Lin[1],-Lin[2]);        // dx,-dy,-dz
00026   P1=Ptxup; P1[0]=-P1[0];                      //-dx,dy,-dz
00027   P2.setvn( Fortax[0],Fortax[1],Fortax[2]);    // dx,dy',dz    
00028   
00029   Vtxup=(Ptxup-P1)&(Ptxup-P2);   
00030   Vtxup=Vtxup.NVerso(); // prodotto vettoriale normalizzato
00031 // per simmetria 
00032   Vtxdw=Vtxup;Vtxdw[1]=-Vtxdw[1];
00033   
00034   /*
00035   Fortax.print("Fortax");
00036   Ptxup.print("Ptxup");
00037   Ptxdw.print("Ptxdw");
00038   P1.print("P1");
00039   P2.print("P2");
00040   Vtxup.print("Vtxup");
00041   Vtxdw.print("Vtxdw");
00042   */
00043   
00044  
00045 }
00046 
00047 
00048 DevXTax::~DevXTax()
00049 {
00050 }
00051 
00052 //======================================================
00053 //----------------- -----P o s i z i o n e ---
00054 int DevXTax::Posizione()
00055 {
00056   if( DevRt::Posizione()>0) return 1; //  il punto e' esterno
00057 // il dev ha un buco centrale rettangolare che diminuisce (o cresce) in y in funzione di z   
00058 // devo scalare le dimensioni y del buco secondo la z tel punto.
00059 
00060   P_Cin=X_dev-Centrin;   // mi riferisco al centro del buco interno 
00061   ForSize=Lin;
00062   ForSize[1]=Lin[1] + 0.5*(Fortax[1]-Lin[1])*(Lin[2]+P_Cin[2])/Lin[2];
00063   Dind=P_Cin-ForSize;
00064   Dins=-(ForSize+P_Cin);
00065     
00066   if(Dins[2]>0.0 || Dind[2]>0.0 || Dins[0]>0.0 ||
00067      Dind[0]>0.0 || Dins[1]>0.0 || Dind[1]>0.0   ) return 0;
00068 // ritorno -1 se il punto e' nel buco altrimento ritorno 0
00069    
00070    return -1;
00071 }
00072 //----------------- --------
00073 void DevXTax::Prgeom()
00074  {
00075 
00076   Gout<<"==================  R i v e l a t o r e =================";
00077   Gout<<"\n --> < "<<nome <<" >  [ "<<fun
00078   <<" ]  X_tax  con foro rettang variabile in y  lungo z ."<<std::endl;
00079   Device::Prgeom();
00080   Gout<<std::endl;
00081 }
00082 
00083 //----------------------C a m I n t e r --------------------
00084 
00085 double DevXTax::CamInter()
00086 {
00087 //uso quella di DevRt per calcolare il cammino
00088 // interno 
00089    tratto=DevRt::CamInter();
00090 //poi verifico se colpisce le pareti del buco .....
00091 //  double nv,t;
00092   camm=-1.;
00093 // calcolo il cammino positivo verso le sei superfici del buco. Per dist>0
00094 // scelgo il cammino maggiore
00095 
00096   if((nv=V_dev[0])>0.0 && Dins[0]>0.0)  // piani x
00097       {t=Dins[0]/nv;  if(t>camm)camm=t;}
00098   else if(nv<0.0 && Dind[0]>0.0)
00099       {t=-Dind[0]/nv; if(t>camm)camm=t;}
00100       
00101 // attenzione: piano inclinato  superiore     
00102   nv=V_dev%Vtxup; dtxd=(Ptxup-P_Cin)%Vtxup; 
00103   if(nv<0.0 && dtxd<0.0)              
00104       {t=dtxd/nv;  if(t>camm)camm=t;}
00105 // piano inferiore... 
00106   nv=V_dev%Vtxdw; dtxd=(Ptxdw-P_Cin)%Vtxdw; 
00107   if(nv<0.0 && dtxd<0.0)
00108       {t=dtxd/nv; if(t>camm)camm=t;}
00109 //
00110   if((nv=V_dev[2])>0.0 && Dins[2]>0.0)  // piani z
00111       {t=Dins[2]/nv;  if(t>camm)camm=t;}
00112   else if(nv<0.0 && Dind[2]>0.0)
00113       {t=-Dind[2]/nv; if(t>camm)camm=t;}
00114 
00115   // quindi confronto camm con tratto e accetto il cammino piu' breve......
00116   if(camm<0.0) {camm=tratto; return camm;}
00117   if(camm>0.0 && tratto<camm) camm=tratto;
00118   return camm;
00119 }
00120 //===============================================================
00121 //--------------- C a m B u c o ---------------------------------
00122 double DevXTax::CamBuco()
00123 {
00124 //  double nv,t;
00125   camm=1.0e+10;
00126 // calcolo il cammino verso le sei superfici
00127 // le distanze sono per definizione negative...
00128 // e scelgo il cammino positivo  minore
00129 
00130 
00131   if((nv=V_dev[0])>0.0)  // piani x
00132       {t=-Dind[0]/nv; if(t<camm)camm=t; }
00133   else if(nv<0.0)
00134       {t=Dins[0]/nv;  if(t<camm)camm=t; }
00135 // piani inclinati y: superiore  Vtxup,Vtxdw sono i versori
00136 // dei piani                       
00137   if( (nv=V_dev%Vtxup) >0.0)  
00138       {dtxd=(Ptxup-P_Cin)%Vtxup;
00139        t=dtxd/nv; if(t<camm)camm=t; }
00140 // piani inclinati: inferiore                    
00141   if( (nv=V_dev%Vtxdw) >0.0)  
00142       {dtxd=(Ptxdw-P_Cin)%Vtxdw;
00143        t=dtxd/nv; if(t<camm)camm=t; }
00144 
00145   if((nv=V_dev[2])>0.0)  // piani z
00146       {t=-Dind[2]/nv; if(t<camm)camm=t; }
00147   else if(nv<0.0)
00148       {t=Dins[2]/nv;  if(t<camm)camm=t; }
00149 return camm;
00150 }
00151 
00152 
00153 
00154 
 All Classes Namespaces Files Functions Variables