| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

BdlTool.cpp

Go to the documentation of this file.
00001 // $Id: BdlTool.cpp,v 1.6 2007/10/05 11:50:50 cattanem Exp $
00002 
00003 // Include files
00004 #include "GaudiKernel/ToolFactory.h"
00005 #include "GaudiKernel/IMagneticFieldSvc.h"
00006 
00007 // Units
00008 #include "GaudiKernel/SystemOfUnits.h"
00009 
00010 // Mathlib
00011 #include "GaudiKernel/Point3DTypes.h"
00012 #include "GaudiKernel/Vector3DTypes.h"
00013 
00014 // local
00015 #include "BdlTool.h"
00016 #include "LutForBdlFunction.h"
00017 
00018 // Instantiation of a static factory class used by clients to create
00019 // instances of this tool
00020 
00021 DECLARE_TOOL_FACTORY( BdlTool );
00022 
00023 // Standard Constructor
00024 BdlTool::BdlTool( const std::string& type,
00025                   const std::string& name,
00026                   const IInterface* parent)
00027   : GaudiTool( type, name, parent ),
00028     m_magFieldSvc(0)
00029 {
00030   declareInterface<IBdlTool>(this);
00031 
00032   declareProperty( "zCenterTT", m_zCenterTT = 247.*Gaudi::Units::cm );
00033 
00034 }
00035 //=========================================================================
00036 //  
00037 //=========================================================================
00038 StatusCode BdlTool::initialize() {
00039   StatusCode sc = GaudiTool::initialize(); // must be executed first
00040   if ( sc.isFailure() ) return sc;  // error printed already by GaudiAlgorithm
00041 
00042   debug() << "==> Initialize" << endmsg;
00043 
00044   // retrieve pointer to magnetic field service
00045   m_magFieldSvc = svc<IMagneticFieldSvc>( "MagneticFieldSvc", true ); 
00046 
00047   info() << "Start generation of L1 LUT tables" << endreq;
00048   // prepare table with Bdl integrations
00049   int nVarLut = 3;
00050   // Bdl integral depends on 3 track parameters
00051   //  slopeY     - y slope of the track
00052   //  zOrigin    - z of track intersection with z axis (in YZ projection)
00053   //  zVeloEnd   - z of the track at which slopeY is given
00054   //
00055   //                     slopeY zOrigin                 zVeloEnd
00056   int nBinVar[3]      = {   30,   10,                    10    }; 
00057   double  leftVar[3]  = { -0.3, -250.*Gaudi::Units::mm,   0.*Gaudi::Units::mm};
00058   double  rightVar[3] = {  0.3,  250.*Gaudi::Units::mm, 800.*Gaudi::Units::mm};
00059   m_lutBdl      = new LutForBdlFunction(nVarLut, nBinVar, leftVar, rightVar);
00060   m_lutZHalfBdl = new LutForBdlFunction(nVarLut, nBinVar, leftVar, rightVar);
00061 
00062   double lutVar[3];
00063   m_lutBdl->resetIndexVector();
00064   m_lutZHalfBdl->resetIndexVector();
00065   int iover = 0;
00066   while(!iover) {
00067     m_lutBdl->getVariableVector(lutVar);
00068     double slopeY   = lutVar[0];
00069     double zOrigin  = lutVar[1];
00070     double zEndVelo = lutVar[2];
00071     f_bdl(slopeY, zOrigin, zEndVelo, m_zCenterTT);
00072     m_lutBdl->fillTable(m_BdlTrack);
00073     m_lutZHalfBdl->fillTable(m_zHalfBdlTrack);
00074     iover = m_lutBdl->incrementIndexVector();
00075     iover = m_lutZHalfBdl->incrementIndexVector();
00076   }
00077 
00078   info() << "Generation of L1 LUT tables finished" << endreq;
00079 
00080   return StatusCode::SUCCESS;
00081 }
00082 //=========================================================================
00083 //  Destructor
00084 //=========================================================================
00085 BdlTool::~BdlTool() {};
00086 
00087 //=========================================================================
00088 //  Finalization
00089 //=========================================================================
00090 StatusCode BdlTool::finalize() {  
00091   delete m_lutBdl;
00092   delete m_lutZHalfBdl;
00093   return GaudiTool::finalize();
00094 };
00095 //****************************************************************************
00096 double BdlTool::bdlIntegral(double ySlopeVelo, double zOrigin, double zVelo) {
00097 
00098     double var[3];
00099     var[0] = ySlopeVelo;
00100     var[1] = zOrigin;
00101     var[2] = zVelo;
00102     return  m_lutBdl->getInterpolatedValueFromTable(var);
00103 }
00104 //****************************************************************************
00105 double BdlTool::zBdlMiddle(double ySlopeVelo, double zOrigin, double zVelo) {
00106 
00107     double var[3];
00108     var[0] = ySlopeVelo;
00109     var[1] = zOrigin;
00110     var[2] = zVelo;
00111     return m_lutZHalfBdl->getInterpolatedValueFromTable(var);
00112 }
00113 
00114 
00115 //****************************************************************************
00116 void BdlTool::f_bdl( double slopeY, double zOrigin, 
00117                      double zStart, double zStop){
00118 
00119     m_BdlTrack=0.0;
00120     m_zHalfBdlTrack=0.0;
00121 
00122     if(zStart>zStop) return;
00123 
00124     double Bdl=0.0;
00125     double zHalfBdl=0.0;
00126 
00127    // vectors to calculate z of half Bdl
00128     m_bdlTmp.clear();
00129     m_zTmp.clear(); 
00130 
00131     // prepare m_zBdlHalf;
00132     Gaudi::XYZPoint  aPoint(0.,0.,0.);
00133     Gaudi::XYZVector bField;
00134 
00135     int np    = 500;
00136     double dz = (zStop - zStart)/np;
00137     double dy = dz*slopeY;
00138 
00139     aPoint.SetX( 0.0 );
00140 
00141     double z = zStart+dz/2.;
00142     double y = slopeY*(zStart-zOrigin);
00143 
00144     double bdl = 0.;
00145 
00146     while( z<zStop ) {
00147       
00148       aPoint.SetY( y );
00149       aPoint.SetZ( z );
00150 
00151       m_magFieldSvc->fieldVector( aPoint, bField );
00152       bdl += dy*bField.z() - dz*bField.y();
00153       if(z>100.*Gaudi::Units::cm) {
00154         m_bdlTmp.push_back(bdl);
00155         m_zTmp.push_back(z);
00156       }
00157       z += dz;
00158       y += dy;
00159     }
00160 
00161     Bdl=bdl;
00162     double bdlhalf = fabs(Bdl)/2.;
00163 
00164     for(unsigned int i=5; i<m_bdlTmp.size()-5; i++) {
00165       if(fabs(m_bdlTmp[i])>bdlhalf) {
00166         double zrat = (Bdl/2.-m_bdlTmp[i-1])/(m_bdlTmp[i]-m_bdlTmp[i-1]);
00167         zHalfBdl = m_zTmp[i-1]+dz*zrat;
00168         break;
00169       }
00170     } 
00171 
00172     m_BdlTrack = Bdl;
00173     m_zHalfBdlTrack = zHalfBdl;
00174 
00175  }
00176 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:04:54 2011 for Magnet by doxygen 1.4.7