diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h index b570ce5a58a2163ec45aedfebec19539d20cc843..e4bec41e8632c6af32b0c1e9a3cfe101a2aa78c3 100644 --- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h +++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/NSWCalibTools/INSWCalibTool.h @@ -30,11 +30,11 @@ namespace NSWCalib { }; } - - + namespace Muon { class MM_RawData; + class MMPrepData; class INSWCalibTool : virtual public IAlgTool { @@ -44,8 +44,9 @@ namespace Muon { public: // interface methods - virtual StatusCode calibrate(const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const = 0; - + virtual StatusCode calibrateClus(const Muon::MMPrepData* prepData, 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 mmGasProperties(float &vDrift, float &longDiff, float &transDiff, float &interactionDensityMean, float &interactionDensitySigma, TF1* &lorentzAngleFunction) const = 0; }; diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx index 69b1eb1176af2657ab54b6a245f8d59499a25e04..e062ad50ba94e0c86e717aa0fca9488b1e07ffd2 100644 --- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx +++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.cxx @@ -5,7 +5,7 @@ #include "NSWCalibTool.h" #include "GaudiKernel/SystemOfUnits.h" #include "GaudiKernel/PhysicalConstants.h" - +#include "MuonReadoutGeometry/MMReadoutElement.h" namespace { static constexpr double const& toRad = M_PI/180; @@ -35,9 +35,7 @@ namespace { } -Muon::NSWCalibTool::NSWCalibTool(const std::string& t, - const std::string& n, - const IInterface* p ) : +Muon::NSWCalibTool::NSWCalibTool(const std::string& t, const std::string& n, const IInterface* p) : AthAlgTool(t,n,p) { declareInterface<INSWCalibTool>(this); @@ -54,7 +52,6 @@ Muon::NSWCalibTool::NSWCalibTool(const std::string& t, StatusCode Muon::NSWCalibTool::initialize() { - ATH_MSG_DEBUG("In initialize()"); ATH_CHECK(m_idHelperSvc.retrieve()); if ( !(m_idHelperSvc->hasMM() && m_idHelperSvc->hasSTgc() ) ) { @@ -62,6 +59,7 @@ StatusCode Muon::NSWCalibTool::initialize() return StatusCode::FAILURE; } ATH_CHECK(m_fieldCondObjInputKey.initialize()); + ATH_CHECK(m_muDetMgrKey.initialize()); ATH_CHECK(initializeGasProperties()); return StatusCode::SUCCESS; } @@ -86,14 +84,7 @@ StatusCode Muon::NSWCalibTool::initializeGasProperties() { return StatusCode::SUCCESS; } -StatusCode Muon::NSWCalibTool::calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const -{ - - double vDriftCorrected; - calibStrip.charge = mmRawData->charge(); - calibStrip.time = mmRawData->time() - globalPos.norm() * reciprocalSpeedOfLight + m_timeOffset; - - calibStrip.identifier = mmRawData->identify(); +StatusCode Muon::NSWCalibTool::calibrateClus(const Muon::MMPrepData* prepData, const Amg::Vector3D& globalPos, std::vector<NSWCalib::CalibratedStrip>& calibClus) const { /// magnetic field MagField::AtlasFieldCache fieldCache; @@ -104,7 +95,6 @@ StatusCode Muon::NSWCalibTool::calibrate( const Muon::MM_RawData* mmRawData, con return StatusCode::FAILURE; } fieldCondObj->getInitializedCache(fieldCache); - Amg::Vector3D magneticField; fieldCache.getField(globalPos.data(), magneticField.data()); @@ -113,26 +103,66 @@ StatusCode Muon::NSWCalibTool::calibrate( const Muon::MM_RawData* mmRawData, con double bfield = (magneticField.x()*std::sin(phi)-magneticField.y()*std::cos(phi))*1000.; /// swap sign depending on the readout side - int gasGap = m_idHelperSvc->mmIdHelper().gasGap(mmRawData->identify()); + int gasGap = m_idHelperSvc->mmIdHelper().gasGap(prepData->identify()); bool changeSign = ( globalPos.z() > 0. ? (gasGap==1 || gasGap==3) : (gasGap==2 || gasGap==4) ); if (changeSign) bfield = -bfield; - /// sign of the lorentz angle matches digitization - angle is in radians + //// sign of the lorentz angle matches digitization - angle is in radians double lorentzAngle = (bfield>0. ? 1. : -1.)*m_lorentzAngleFunction->Eval(std::abs(bfield)) * toRad; - vDriftCorrected = m_vDrift * std::cos(lorentzAngle); + /// loop over prepData strips + for (unsigned int i = 0; i < prepData->stripNumbers().size(); i++){ + double time = prepData->stripTimes().at(i); + double charge = prepData->stripCharges().at(i); + NSWCalib::CalibratedStrip calibStrip; + ATH_CHECK(calibrateStrip(time, charge, lorentzAngle, calibStrip)); + calibClus.push_back(calibStrip); + } + return StatusCode::SUCCESS; +} + +StatusCode Muon::NSWCalibTool::calibrateStrip(const double time, const double charge, const double lorentzAngle, NSWCalib::CalibratedStrip& calibStrip) const { + calibStrip.charge = charge; + calibStrip.time = time; + + double vDriftCorrected = m_vDrift * std::cos(lorentzAngle); calibStrip.distDrift = vDriftCorrected * calibStrip.time; /// transversal and longitudinal components of the resolution - calibStrip.resTransDistDrift = pitchErr + std::pow(m_transDiff * calibStrip.distDrift, 2); - calibStrip.resLongDistDrift = std::pow(m_ionUncertainty * vDriftCorrected, 2) + 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; } +StatusCode Muon::NSWCalibTool::calibrateStrip(const Muon::MM_RawData* mmRawData, NSWCalib::CalibratedStrip& calibStrip) const +{ + Identifier rdoId = mmRawData->identify(); + + // @TODO: for the shifter: this code will be used as soon as the NSW is built in the MuonDetectorCondAlg + // for now, we will need to use the nominal manager from the detectorStore to run + // SG::ReadCondHandle<MuonGM::MuonDetectorManager> muDetMgrHandle{m_muDetMgrKey}; + // const MuonGM::MuonDetectorManager* muDetMgr = muDetMgrHandle.cptr(); + const MuonGM::MuonDetectorManager* muDetMgr=nullptr; + ATH_CHECK(detStore()->retrieve(muDetMgr)); + + //get globalPos + Amg::Vector3D globalPos; + const MuonGM::MMReadoutElement* detEl = muDetMgr->getMMReadoutElement(rdoId); + detEl->stripGlobalPosition(rdoId,globalPos); + + calibStrip.charge = mmRawData->charge(); + calibStrip.time = mmRawData->time() - globalPos.norm() * reciprocalSpeedOfLight + m_timeOffset; + calibStrip.identifier = mmRawData->identify(); + + calibStrip.distDrift = m_vDrift * calibStrip.time; + calibStrip.resTransDistDrift = pitchErr + std::pow(m_transDiff * calibStrip.distDrift, 2); + calibStrip.resLongDistDrift = std::pow(m_ionUncertainty * m_vDrift, 2) + + std::pow(m_longDiff * calibStrip.distDrift, 2); + + return StatusCode::SUCCESS; +} StatusCode Muon::NSWCalibTool::finalize() { @@ -150,4 +180,4 @@ StatusCode Muon::NSWCalibTool::mmGasProperties(float &vDrift, float &longDiff, f interactionDensitySigma = m_interactionDensitySigma; lorentzAngleFunction = m_lorentzAngleFunction; return StatusCode::SUCCESS; -} \ No newline at end of file +} diff --git a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h index 6abecefb29e8e36b94c3d8a52b6c5aaffa571eb0..8dfae42011729524a23dbb88fc7f4e285638c9c5 100644 --- a/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h +++ b/MuonSpectrometer/MuonCalib/NSWCalib/NSWCalibTools/src/NSWCalibTool.h @@ -16,6 +16,7 @@ #include "MuonPrepRawData/MMPrepData.h" #include "MuonRDO/MM_RawData.h" #include "StoreGate/ReadCondHandleKey.h" +#include "MuonReadoutGeometry/MuonDetectorManager.h" #include "MagFieldConditions/AtlasFieldCacheCondObj.h" #include "TRandom3.h" @@ -31,7 +32,9 @@ namespace Muon { virtual ~NSWCalibTool() = default; - virtual StatusCode calibrate( const Muon::MM_RawData* mmRawData, const Amg::Vector3D& globalPos, NSWCalib::CalibratedStrip& calibStrip) const override; + StatusCode calibrateClus(const Muon::MMPrepData* prepData, const Amg::Vector3D& globalPos, std::vector<NSWCalib::CalibratedStrip>& calibClus) const; + StatusCode calibrateStrip(const double time, const double charge, const double lorentzAngle, NSWCalib::CalibratedStrip& calibStrip) const; + StatusCode calibrateStrip(const Muon::MM_RawData* mmRawData, NSWCalib::CalibratedStrip& calibStrip) const; virtual StatusCode initialize() override; virtual StatusCode finalize() override; @@ -41,6 +44,8 @@ namespace Muon { ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}; SG::ReadCondHandleKey<AtlasFieldCacheCondObj> m_fieldCondObjInputKey {this, "AtlasFieldCacheCondObj", "fieldCondObj"}; + SG::ReadCondHandleKey<MuonGM::MuonDetectorManager> m_muDetMgrKey {this, "DetectorManagerKey", "MuonDetectorManager", "Key of input MuonDetectorManager condition data"}; + StatusCode initializeGasProperties(); TF1* m_lorentzAngleFunction; diff --git a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx index 9c714838d2aa30dd06319b5acae8cd4ca2b620d6..b385a199b2b567ed2deb92e43db00dbc2a47e679 100644 --- a/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx +++ b/MuonSpectrometer/MuonCnv/MuonMM_CnvTools/src/MmRdoToPrepDataToolCore.cxx @@ -143,7 +143,7 @@ StatusCode Muon::MmRdoToPrepDataToolCore::processCollection(const MM_RawDataColl continue; } NSWCalib::CalibratedStrip calibStrip; - ATH_CHECK (m_calibTool->calibrate(rdo, globalPos, calibStrip)); + ATH_CHECK (m_calibTool->calibrateStrip(rdo, calibStrip)); const Amg::Vector3D globalDir(globalPos.x(), globalPos.y(), globalPos.z()); Trk::LocalDirection localDir;