FlyoDoc_2011 Pisa 2011 by GmP --- 011
Public Member Functions | Protected Attributes

DevFlt Class Reference

#include <devflt.h>

Inheritance diagram for DevFlt:
DevRtCl DevRt Device

List of all members.

Public Member Functions

 DevFlt ()
double Get_CamMag ()
virtual int Traccia (Particella *)
 ================ T R A C C I A ====================================
virtual void Prgeom ()

Protected Attributes

gvet B
gvet X
gvet XIN
gvet PIN
gvet VSIN
gvet Puls
gvet KIK
gvet Pvers
gvet Dvers
int iter_mag
double step
double dse
double path
double rho
double freestep
double vol_max
double cam_max

Detailed Description

device esternamente rettangolare, internamente cilindrico.

Author:
gmp

Definition at line 17 of file devflt.h.


Constructor & Destructor Documentation

DevFlt::DevFlt ( )

magnete Mag.con buco per filtro DevFlt 22 attenzione rivedre bene la definizione dei vettori dev....per rotazioni e traslazioni dal lab.....

Definition at line 27 of file devflt.cpp.

 : DevRtCl()
{
   devtype=TypDevFlt;
   devclass="Magn_Filter";
//  campo costante  campo=0 default;
//  campo variabile campo>0; Definire.... ricorda! 
   campo=0;
}

Member Function Documentation

int DevFlt::Traccia ( Particella pr) [virtual]

================ T R A C C I A ====================================

Traccia le particelle nell'apparato per un tratto come definito in Get_camm(). Nel tracciare la particella si tiene conto della possibilita' della pair production e del bremsstrhalung.

====================================================================================

Reimplemented from Device.

Definition at line 59 of file devflt.cpp.

 {
   
// see the DevMagn:: Traccia()
 // 18/03/03 update: general tracing.. the magnetic field now could be variable
// and without any restriction..
// attention! inside the magnet no brems, nor pairprod for the moment..
// the track tracing is iterative with step size small enough  to keep the
// tracing errors to very low  values
//
//*****
// La carica elementare nel sistema Ibrido e'
//    ec=.299792458[ Gev/c * T**(-1) m **(-1) ] 
// va qui moltiplicata per 10e-6 poiche'
// si usa il Gauss ed il Centimetro; segue...
// r(cm)=[p cos(lambda)(GeV)]/(2.9979258e-7 * H(Gauss) )

  const double ec=2.99792458e-7;
//****

  
// qui il campo è differente da zero solo nel ferro... il campo nel buco è nullo!!!  
// si vuole filtrare via i muoni....
  
  if(nowpos==ESTERNO || nowpos==INBUCO)   // se esterno o nel buco traccia regolarmente...
      { Device::Traccia(pr);  return  0;}
// allora e' INTERNO: si traccia in campo magnetico.      
  if (pr->P.norma == 0.0)     return  0;    // no motion ....
  if (pr->Get_Charg() == 0.0)               // neutra traccio regolamente
      { Device::Traccia(pr);  return  0;}

 
//------------
  X=Lab2cDev(pr->X);                // Coordinata di impatto sul dev
  PIN=Puls=Lab2Dev(pr->P);        // impulso vettore in device....
  VSIN=Pvers=Puls.Verso();
  XIN=X;                          // device frame coordinates
  vol_max=pr->pathok;             // cammino potenziale prima di decadere!
//  P_Cin=X-Centrin;                //Occorre in Get_CamMag(), specie per buchi non simmetrici
   P_Cin=X;
  freestep=cam_max=Get_CamMag();     // cammino potenziale in linea retta  per uscire dal magnete
  if(freestep>vol_max) freestep=vol_max;


/* Campo in Field
 campo=0    B field costante    (va definito nella classe)
 campo>0    B field variabile
*/
  if(campo==0)
   {
    if (Field.norma == 0.0)
    { Gout<<"\n *** error***  Standard magnet "<<nome<<"  null field???";
    exit(0);}
   }
   // se variabile ridefinisco  il campo iniziale
  else Get_Field(P_Cin);    

         
// nota il  sistema di riferimento dei vettori e' quello del dev.
// predico il raggio di curvatura.... massimo...
  rho= 9999999. ;
  if(Field.norma>0.0001)rho = Puls.Norma()/(ec*Field.norma);

// il calcolo corretto e'  rho= (P&H).Norma/(H_norma**2*ec)

 
/*************/
  if(rho<2.*freestep) return 1;    // la particella resta intrappolata....

// definizione dello step.
  step =rho/3000.;
  if(step<2.)step=2.;
  else if(step>25.)step=25.;
  if(step>freestep) step= freestep+0.04;
  dse = step*ec*pr->Get_Charg();
  path=0.0;
  iter_mag=0;
  
  
  
     
 if(Debugon==1)
  {// ok nel caso di campo costante ==> valore significativo
    double forkik=ec*Field.norma*cam_max*pr->Get_Charg();
    Gout<<"\n\n Ev="<<evento_.Gen.Event<<" "<<pr->Get_Nome()<<" in  "<<nome
        <<"  pathok="<<pr->pathok<<" Cammx="<< cam_max
        <<"  freestep "<<freestep        
        <<" Kik="<<forkik<<"  rho="<<rho;
    Field.print("Field");
    
  }
  
     
 
  
// tracing main loop  =======================
  while (iter_mag++<MAXITER)
  {
    if(campo>0) Get_Field(P_Cin);      //variabile

/*
     
     evento_.Event,nome,pr->Get_Nome(),pr->pathok,cam_max,rho);  
     Pvers.print("pvers");  
     P_Cin.print(pr->Get_Nome());
     Field.print("Field");
  */  
           
    Puls+= Pvers&Field * dse;        // Aggiorno P dopo un cammino ds
    Pvers=Puls.NVerso();             // calcola la nuova direzione di volo
    P_Cin+= step*Pvers;           // aggiorno la posizione
    path+=step;                   // aggiorno il cammino
     
//  check for end  iteration...
    if(step>freestep) break;        // decaduta...o uscita dal mag...
    freestep-=step;                 //aggiorno il cammino da fare

      if (fabs(X[0])> Lout[0] || fabs(X[1])> Lout[1] ||fabs(X[2])> Lout[2])   break;
      
//      if (fabs(P_Cin[0])> Loin[0] || fabs(P_Cin[1])> Lin[1] ||fabs(P_Cin[2])> Lin[2])   break;      
      
       
   if(step>freestep)               // se supero con uno step il cammino restante allora...
     {
//    allora calcolo il cammino potenziale restante...
      freestep=Get_CamMag();
      if(freestep>vol_max-path)freestep=vol_max-path;
      if(step>freestep)
        {step= freestep+0.04;
         if(step<0.06) break;
         dse = step*ec*pr->Get_Charg();
        }
      }

      
   }
    
  

// tracing end ====================================
 
  if (iter_mag> 499)
     {
      Gout<<"\n\n Ev="<<evento_.Gen.Event<<" Trac. in "<<nome
          <<" iter "<<iter_mag<<" for "<<  pr->Get_Nome()<< " P norma "<< pr->P.norma
          <<" camx "<< cam_max<<"  rho="<<rho<<" step "<<step;    
      return (1);
     }

  //  ===>  go back to the apparatus system

  pr->P.setvn(Dev2Lab(Puls),pr->Get_Massa());    // nota calcola anche la norma
  pr->Vers=pr->P.Verso();
  X=P_Cin+Centrin;
  pr->X=Devc2Lab(X)+ 0.01*pr->Vers;  // non norma... + piccolo spostamento

  pr->pathok=path;
  pr->path_done+=path;

/*****************************/
 if(Debugon==1)
   {
     KIK=Puls-PIN;
     Devc2Lab(XIN).print("Xin");
     pr->X.print("Xout");
     PIN.print("Pin");
     Puls.print("Pout");
     KIK.Norma();
     KIK.print("KIK");
//     Field.print("Last Field");
     Gout<<"\n.. "<< nome <<" for "<<pr->Get_Nome()<<"  Patok="<<freestep<<" Path "
         <<path<<" Iter="<< iter_mag<<std::endl;
    }
/*****************************/


  return (0);
}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables