diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h index 5fe01c03c811571992e636738ac2b25c65cc3f57..e7ddd2c229b541acd69fc5f7293ead15949327af 100644 --- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h +++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h @@ -6,12 +6,29 @@ #include "GaudiKernel/IAlgTool.h" #include "GeoPrimitives/GeoPrimitives.h" +#include "Identifier/Identifier.h" #include <cmath> #include <vector> static const InterfaceID IID_INSWCalibTool("Muon::INSWCalibTool",1,0); +namespace NSWCalib { + + struct CalibratedStrip { + double charge; + double time; + double resTime; + double distDrift; + double resTransDistDrift; + double resLongDistDrift; + double dx; + Identifier identifier; + }; + +} + + namespace Muon { class MM_RawData; @@ -23,8 +40,8 @@ namespace Muon { static const InterfaceID& interfaceID() {return IID_INSWCalibTool;} public: // interface methods - - virtual StatusCode calibrate(const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, double& dist_drift, double& distRes_drift, double& calib_charge) = 0; + + virtual StatusCode calibrate(const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const = 0; }; diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx index b61b4f74dc8e09c77a56b27fc409ae85da96574d..9479d6368c77f2d250cf7d20d4b21db50347bf82 100644 --- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx +++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx @@ -1,8 +1,11 @@ #include "NSWCalibTool.h" #include "GaudiKernel/SystemOfUnits.h" +#include "GaudiKernel/PhysicalConstants.h" namespace { static constexpr double const& toRad = M_PI/180; + static constexpr double const& pitchErr = 0.425 * 0.425 / 12; + static constexpr double const& reciprocalSpeedOfLight = Gaudi::Units::c_light * 1e-6; // mm/ns } Muon::NSWCalibTool::NSWCalibTool(const std::string& t, @@ -15,10 +18,13 @@ Muon::NSWCalibTool::NSWCalibTool(const std::string& t, declareInterface<INSWCalibTool>(this); declareProperty("MagFieldSvc", m_magFieldSvc, "Magnetic Field Service"); - declareProperty("DriftVelocity", m_vDrift = 47., "Drift Velocity"); + declareProperty("DriftVelocity", m_vDrift = 0.047, "Drift Velocity"); declareProperty("TimeResolution", m_timeRes = 25., "Time Resolution"); + declareProperty("longDiff",m_longDiff=0.019); //mm/mm + declareProperty("transDiff",m_transDiff=0.036); //mm/mm + declareProperty("ionUncertainty",m_ionUncertainty=4.0); //ns + declareProperty("timeOffset", m_timeOffset = 100); //ns declareProperty("MuonIdHelperTool", m_idHelperTool); - } @@ -41,29 +47,27 @@ StatusCode Muon::NSWCalibTool::initialize() } -StatusCode Muon::NSWCalibTool::calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, double& dist_drift, double& distRes_drift, double& calib_charge) +StatusCode Muon::NSWCalibTool::calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const { - double charge, time, vDriftCorrected; - charge = mmRawData->charge(); - time = mmRawData->time(); + double vDriftCorrected; + calibStrip.charge = mmRawData->charge(); + calibStrip.time = mmRawData->time() - globalPos.norm() * reciprocalSpeedOfLight + m_timeOffset; + + calibStrip.identifier = mmRawData->identify(); Amg::Vector3D magneticField; - calib_charge = charge; m_magFieldSvc->getField(&globalPos,&magneticField); - m_mmBFieldX = magneticField.x(); - m_mmBFieldY = magneticField.y(); - m_mmBFieldZ = magneticField.z(); double lorentzAngle = m_lorentzAngleFunction->Eval((magneticField.y() > 0. ? 1. : -1.) * std::fabs (magneticField.y()) ) * toRad; // in radians; vDriftCorrected = m_vDrift * std::cos(lorentzAngle); - dist_drift = vDriftCorrected * time; - dist_drift = dist_drift * Gaudi::Units::perThousand; - distRes_drift = vDriftCorrected * m_timeRes; - distRes_drift = distRes_drift * Gaudi::Units::perThousand; + calibStrip.distDrift = vDriftCorrected * calibStrip.time; + calibStrip.resTransDistDrift = pitchErr + std::pow(m_transDiff * calibStrip.distDrift, 2); + calibStrip.resLongDistDrift = std::pow(m_ionUncertainty * vDriftCorrected, 2) + std::pow(m_longDiff * calibStrip.distDrift, 2); + calibStrip.dx = std::sin(lorentzAngle) * calibStrip.time * m_vDrift; - return StatusCode::SUCCESS; + return StatusCode::SUCCESS; } diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h index a43d369346482d5a40a5015f23a4a727b7b4c9b5..074c2af829181affa7e47464d7004d599e8ee320 100644 --- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h +++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h @@ -34,7 +34,8 @@ namespace Muon { virtual ~NSWCalibTool() = default; - StatusCode calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, double& dist_drift, double& distRes_drift, double& calib_charge); + StatusCode calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const; + virtual StatusCode initialize(); virtual StatusCode finalize(); @@ -46,13 +47,13 @@ namespace Muon { TF1* m_lorentzAngleFunction; - - float m_mmBFieldX; - float m_mmBFieldY; - float m_mmBFieldZ; - + float m_vDrift; float m_timeRes; + float m_longDiff; + float m_transDiff; + float m_ionUncertainty; + double m_timeOffset; }; } diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx index 4ee5b29f81bb30b63ff7196e032a38422c9e1235..df073ac4d0d5779c44405b49f50f068b5680a863 100644 --- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataTool.cxx @@ -184,11 +184,8 @@ StatusCode Muon::MmRdoToPrepDataTool::processCollection( const MM_RawDataCollect ATH_MSG_WARNING("Could not get the global strip position for MM"); continue; } - double dist_drift, distRes_drift, charge_calib; - ATH_CHECK (m_calibTool->calibrate(rdo, globalPos, dist_drift, distRes_drift, charge_calib)); - - const int time = rdo->time(); - const int charge = charge_calib; + NSWCalib::CalibratedStrip calibStrip; + ATH_CHECK (m_calibTool->calibrate(rdo, globalPos, calibStrip)); // const Trk::Surface& surf = detEl->surface(rdoId); // const Amg::Vector3D* globalPos = surf.localToGlobal(localPos); @@ -221,14 +218,16 @@ StatusCode Muon::MmRdoToPrepDataTool::processCollection( const MM_RawDataCollect // add strip width to error resolution = sqrt(resolution*resolution+errX*errX); - Amg::MatrixX* cov = new Amg::MatrixX(1,1); + Amg::MatrixX* cov = new Amg::MatrixX(2,2); cov->setIdentity(); - (*cov)(0,0) = resolution*resolution; + (*cov)(0,0) = calibStrip.resTransDistDrift; + (*cov)(1,1) = calibStrip.resLongDistDrift; + localPos.x() =+ calibStrip.dx; if(!merge) { - prdColl->push_back(new MMPrepData(prdId, hash, localPos, rdoList, cov, detEl, time, charge, dist_drift)); + prdColl->push_back(new MMPrepData(prdId, hash, localPos, rdoList, cov, detEl, calibStrip.time, calibStrip.charge, calibStrip.distDrift)); } else { - MMPrepData mpd = MMPrepData(prdId, hash, localPos, rdoList, cov, detEl, time, charge, dist_drift); + MMPrepData mpd = MMPrepData(prdId, hash, localPos, rdoList, cov, detEl, calibStrip.time, calibStrip.charge, calibStrip.distDrift); // set the hash of the MMPrepData such that it contains the correct value in case it gets used in SimpleMMClusterBuilderTool::getClusters mpd.setHashAndIndex(hash,0); MMprds.push_back(mpd);