00001
00002
00003
00004 #include "GaudiKernel/ToolFactory.h"
00005 #include "GaudiKernel/IMagneticFieldSvc.h"
00006
00007
00008 #include "GaudiKernel/SystemOfUnits.h"
00009
00010
00011 #include "GaudiKernel/Point3DTypes.h"
00012 #include "GaudiKernel/Vector3DTypes.h"
00013
00014
00015 #include "BdlTool.h"
00016 #include "LutForBdlFunction.h"
00017
00018
00019
00020
00021 DECLARE_TOOL_FACTORY( BdlTool );
00022
00023
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();
00040 if ( sc.isFailure() ) return sc;
00041
00042 debug() << "==> Initialize" << endmsg;
00043
00044
00045 m_magFieldSvc = svc<IMagneticFieldSvc>( "MagneticFieldSvc", true );
00046
00047 info() << "Start generation of L1 LUT tables" << endreq;
00048
00049 int nVarLut = 3;
00050
00051
00052
00053
00054
00055
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
00084
00085 BdlTool::~BdlTool() {};
00086
00087
00088
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
00128 m_bdlTmp.clear();
00129 m_zTmp.clear();
00130
00131
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