diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h index 0b7e78c0cafcba65bf3b47cb4fa3e19e29fc2434..49dc27e6bc8476947fccc5f9256c8f301a132a74 100644 --- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h +++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h @@ -10,6 +10,7 @@ #include <cmath> #include <vector> +#include "float.h" #include "TF1.h" @@ -26,6 +27,7 @@ namespace NSWCalib { double resTransDistDrift = 0; double resLongDistDrift = 0; double dx = 0; + Amg::Vector2D locPos = Amg::Vector2D(-FLT_MAX,-FLT_MAX); Identifier identifier; }; @@ -47,7 +49,7 @@ namespace Muon { virtual StatusCode calibrateClus(const Muon::MMPrepData* prepRawData, const Amg::Vector3D& globalPos, std::vector<NSWCalib::CalibratedStrip>& calibClus) const = 0; virtual StatusCode calibrateStrip(const Muon::MM_RawData* mmRawData, NSWCalib::CalibratedStrip& calibStrip) const = 0; - virtual StatusCode calibrateStrip(const double time, const double charge, const double lorentzAngle, NSWCalib::CalibratedStrip&calibStrip) const = 0; + virtual StatusCode calibrateStrip(const Identifier id, const double time, const double charge, const double lorentzAngle, NSWCalib::CalibratedStrip&calibStrip) const = 0; virtual StatusCode calibrateStrip(const Muon::STGC_RawData* sTGCRawData, NSWCalib::CalibratedStrip& calibStrip) const = 0; virtual StatusCode mmGasProperties(float &vDrift, float &longDiff, float &transDiff, float &interactionDensityMean, float &interactionDensitySigma, TF1* &lorentzAngleFunction) const = 0; virtual float peakTime() const = 0; diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx index 75b401902c71e4d784ecb3a2841b060d9c4a372f..5bfc299ee2813c6989d302b4f0127e4f1969e485 100644 --- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx +++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx @@ -130,10 +130,11 @@ StatusCode Muon::NSWCalibTool::calibrateClus(const Muon::MMPrepData* prepData, c /// loop over prepData strips for (unsigned int i = 0; i < prepData->stripNumbers().size(); i++){ + Identifier id = prepData->rdoList().at(i); double time = prepData->stripTimes().at(i); double charge = prepData->stripCharges().at(i); NSWCalib::CalibratedStrip calibStrip; - ATH_CHECK(calibrateStrip(time, charge, lorentzAngle, calibStrip)); + ATH_CHECK(calibrateStrip(id,time, charge, lorentzAngle, calibStrip)); calibClus.push_back(calibStrip); } return StatusCode::SUCCESS; @@ -141,7 +142,16 @@ StatusCode Muon::NSWCalibTool::calibrateClus(const Muon::MMPrepData* prepData, c -StatusCode Muon::NSWCalibTool::calibrateStrip(const double time, const double charge, const double lorentzAngle, NSWCalib::CalibratedStrip& calibStrip) const { +StatusCode Muon::NSWCalibTool::calibrateStrip(const Identifier id, const double time, const double charge, const double lorentzAngle, NSWCalib::CalibratedStrip& calibStrip) const { + //get local positon + Amg::Vector2D locPos; + if(!localStripPosition(id,locPos)) { + ATH_MSG_WARNING("Failed to retrieve local strip position"); + return StatusCode::FAILURE; + } + + calibStrip.identifier = id; + calibStrip.charge = charge; calibStrip.time = time; @@ -153,6 +163,7 @@ StatusCode Muon::NSWCalibTool::calibrateStrip(const double time, const double ch calibStrip.resLongDistDrift = std::pow(m_ionUncertainty * vDriftCorrected, 2) + std::pow(m_longDiff * calibStrip.distDrift, 2); calibStrip.dx = std::sin(lorentzAngle) * calibStrip.time * m_vDrift; + calibStrip.locPos = Amg::Vector2D(locPos.x() + calibStrip.dx, locPos.y()); return StatusCode::SUCCESS; } @@ -170,6 +181,16 @@ StatusCode Muon::NSWCalibTool::calibrateStrip(const Muon::MM_RawData* mmRawData, const MuonGM::MMReadoutElement* detEl = muDetMgr->getMMReadoutElement(rdoId); detEl->stripGlobalPosition(rdoId,globalPos); + //get local postion + Amg::Vector2D locPos; + if(!localStripPosition(rdoId,locPos)) { + ATH_MSG_WARNING("Failed to retrieve local strip position"); + return StatusCode::FAILURE; + } + + //get stripWidth + detEl->getDesign(rdoId)->channelWidth(locPos); // positon is not used for strip width + calibStrip.charge = mmRawData->charge(); calibStrip.time = mmRawData->time() - globalPos.norm() * reciprocalSpeedOfLight - m_peakTime; calibStrip.identifier = mmRawData->identify(); @@ -179,6 +200,8 @@ StatusCode Muon::NSWCalibTool::calibrateStrip(const Muon::MM_RawData* mmRawData, calibStrip.resLongDistDrift = std::pow(m_ionUncertainty * m_vDrift, 2) + std::pow(m_longDiff * calibStrip.distDrift, 2); + calibStrip.locPos = locPos; + return StatusCode::SUCCESS; } @@ -194,10 +217,18 @@ StatusCode Muon::NSWCalibTool::calibrateStrip(const Muon::STGC_RawData* sTGCRawD Amg::Vector3D globalPos; const MuonGM::sTgcReadoutElement* detEl = muDetMgr->getsTgcReadoutElement(rdoId); detEl->stripGlobalPosition(rdoId,globalPos); + + //get local postion + Amg::Vector2D locPos; + if(!localStripPosition(rdoId,locPos)) { + ATH_MSG_WARNING("Failed to retrieve local strip position"); + return StatusCode::FAILURE; + } calibStrip.charge =sTGCRawData->charge(); calibStrip.time = sTGCRawData->time() - globalPos.norm() * reciprocalSpeedOfLight - m_peakTime; calibStrip.identifier = sTGCRawData->identify(); + calibStrip.locPos = locPos; return StatusCode::SUCCESS; } @@ -247,3 +278,19 @@ StatusCode Muon::NSWCalibTool::mmGasProperties(float &vDrift, float &longDiff, f lorentzAngleFunction = m_lorentzAngleFunction; return StatusCode::SUCCESS; } + + +bool Muon::NSWCalibTool::localStripPosition(const Identifier& id, Amg::Vector2D &locPos) const { + if(m_idHelperSvc->isMM(id)){ + const MuonGM::MMReadoutElement* detEl = m_muonMgr->getMMReadoutElement(id); + return detEl->stripPosition(id,locPos); + + } else if(m_idHelperSvc->issTgc(id)){ + const MuonGM::sTgcReadoutElement* detEl = m_muonMgr->getsTgcReadoutElement(id); + return detEl->stripPosition(id,locPos); + + } else { + return false; + } + +} diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h index 60d44d2f5dade4901705765366cab0eac724cb88..1a895f52b526a030807bbf4fc49d3e05cddd8589 100644 --- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h +++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h @@ -66,6 +66,8 @@ namespace Muon { float m_ionUncertainty; double m_peakTime; + bool localStripPosition(const Identifier& id, Amg::Vector2D &locPos) const; + std::string m_gasMixture; };