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

DevMagn Class Reference

#include <devmagn.h>

Inheritance diagram for DevMagn:
DevRtRt DevRt Device DevQuad

List of all members.

Public Member Functions

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

Public Attributes

int iter_mag
double step
double dse
double path
double rho
double freestep
double vol_max
double cam_max

Protected Attributes

gvet B
gvet X
gvet XIN
gvet PIN
gvet VSIN
gvet Puls
gvet KIK
gvet Pvers
gvet Dvers

Detailed Description

Magnete parallepipedo con buco rettangolare interno

Author:
Giuseppe Pierazzini

Definition at line 23 of file devmagn.h.


Member Function Documentation

int DevMagn::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 60 of file devmagn.cpp.

{

  // 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) )
  //**
  // note 2007 the field is in the hole!

  const double ec=2.99792458e-7;

 

  if(nowpos==ESTERNO)         return Device::Traccia(pr); // se esterno traccia regolarmente...
  else if(nowpos==INTERNO)
  { // se interno (!no nel buco) traccio regolarmente per i mu.. le altre particelle sono perse...
    if (pr->Get_Nome()==Mum||pr->Get_Nome()==Mup) return Device::Traccia(pr);
    else  return -1;       // traccia lost in the frame
  }
  if (pr->P.norma == 0.0)     return  0;                  // no motion ....
  if (pr->Get_Charg() == 0.0) return Device::Traccia(pr);  // neutra traccio regolamente dritto


  //------------ tracing in the field....
  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
  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(Debugon==1) 
  
//   if( (idev==9||idev==10)&&pr->Get_Idm()==14)
  {// ok nel caso di campo costante ==> valore significativo
    double forkik=ec*Field.norma*cam_max*pr->Get_Charg();
    Gout<<"\n\n Traccia  Ev="
    <<setprecision(0)<<fixed
    <<setw(6)<<Eventi_Fatti<<" "
    <<setw(6)<<pr->Get_Nome()<<" in"
    <<setw(6)<<nome<<"  pth="
    <<setprecision(1)<<fixed
    <<setw(7)<<pr->pathok<<" Cmx="
    <<setw(7)<<cam_max<<" rho="
    <<setw(7)<<rho<<" kik="
    <<setprecision(4)<<fixed
    <<setw(6)<<forkik;
    Field.print("Field");
    X.print("X_in");
    PIN.print("p_in");
  }
  /*************/
  if(rho<2.*freestep) return 1;    // la particella resta intrappolata....

  // definizione dello step.

  step =rho/3000.;
// if(step<0.04)step=0.04;  
  double stepmin=freestep/400.;
 
  if(step<stepmin)step=stepmin;
  else if(step>3.)step=3.;
  if(step>freestep) step= freestep+0.01;


  dse = step*ec*pr->Get_Charg();
  path=0.0;
  iter_mag=0;

  // 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

    //    test if still inside!!Rectangular shape ! for different shape not yet implemented
    if (fabs(P_Cin[0])> Lin[0] || fabs(P_Cin[1])> Lin[1] ||fabs(P_Cin[2])> Lin[2]) break;

    /*{
      if(idev==36)
      {
        P_Cin.print("X1");Gout<<" Ev "<<evento_.Event<<" iter "<<iter_mag;
      }

      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.01;
        if(step<0.05)break;
        dse = step*ec*pr->Get_Charg();
      }
    }


  }



  // tracing end ====================================



  //  ===>  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;

  // si deve tener conto del multiploscattering ??
  Mscatter(pr,path);



  if (iter_mag> 400)
  {

    Gout<<"\n\n Even="<<evento_.Gen.Event<<" "<<nome
    <<" iter "<<iter_mag<<" for "<<  pr->Get_Nome()<< " P_norma "<< pr->P.norma
    <<" Camx "<< cam_max<<"  rho="<<rho<<" step "<<step;
    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()<<" Zstp="
    <<setprecision(2)<<fixed
    <<setw(6)<<freestep<<" Path="
    <<setprecision(1)<<fixed
    <<setw(7)<<path<<" Iter="
    <<setw(5)<<iter_mag<<" end tracing"<<std::endl;

    return (1);
  }

  /*****************************/ 
  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()<<" Zstp="
    <<std::setprecision(2)<<fixed
    <<setw(6)<<freestep<<" Path="
    <<setprecision(1)<<fixed
    <<setw(7)<<path<<" Iter="
    <<setw(5)<<iter_mag<<" end tracing"<<std::endl;
  }
  /*****************************/


  return (0);
}

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