Skip to content
Snippets Groups Projects
Commit a6858562 authored by Maria Carnesale's avatar Maria Carnesale Committed by John Derek Chapman
Browse files

NSW Calib Tool

parent 0d80e364
15 merge requests!46457Draft: Adding the tools to run over data,!46454Draft: Adding the tools to be able to run over data,!44869Draft: Update to candidate store,!4217921.9-first_steps-InDetTrackingGeometryXML,!39162Draft: Insert BCM' support,!38765Bis78 cabling,!36893Fix size of RPC active region in BIS78 and strip material,!3645821.9: Improving material map description (ATLITKSW-127),!36293WIP pixel updates,!34993KF-input adding jXERHO to the AOD outputs,!34864LH rings in front ot HR rigs,!34763Fix L1_4jJ15.0ETA25 item definition (ATR-21261),!33996WIP: Correct MM zpositions,!33148Merge 21.3.20 and 21.3.21 into 21.9,!3291021.3 salva s0
......@@ -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;
};
......
#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;
}
......
......@@ -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;
};
}
......
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment