// Tb/TbEvent #include "Event/TbCluster.h" #include "Event/TbTrack.h" #include "Event/TbKalmanTrack.h" #include "Event/TbKalmanNode.h" // Local #include "TbKalmanTrackFit.h" DECLARE_TOOL_FACTORY(TbKalmanTrackFit) //============================================================================= // Standard constructor, initializes variables //============================================================================= TbKalmanTrackFit::TbKalmanTrackFit(const std::string& type, const std::string& name, const IInterface* parent) : GaudiTool(type, name, parent), m_fitter(nullptr), m_geomSvc(nullptr) { declareInterface<ITbTrackFit>(this); declareProperty("MaskedPlanes", m_maskedPlanes = {}); declareProperty("HitError", m_hiterror = 0.004); declareProperty("Noise2", m_scat2 = 1.2e-8); m_hiterror2 = m_hiterror * m_hiterror; } //============================================================================= // Destructor //============================================================================= TbKalmanTrackFit::~TbKalmanTrackFit() {} //============================================================================= // Initialisation //============================================================================= StatusCode TbKalmanTrackFit::initialize() { // Initialise the base class. StatusCode sc = GaudiTool::initialize(); if (sc.isFailure()) return sc; // Get the straight-line fit tool (used for seeding the Kalman filter). m_fitter = tool<ITbTrackFit>("TbTrackFit", "StraightLineFitter", this); // Get the number of telescope planes. const auto nPlanes = geomSvc()->modules().size(); // Set the flags whether a plane is masked or not. m_masked.resize(nPlanes, false); for (const unsigned int plane : m_maskedPlanes) { m_masked[plane] = true; m_fitter->maskPlane(plane); } return StatusCode::SUCCESS; } //============================================================================= // Exclude a plane from the fit //============================================================================= void TbKalmanTrackFit::maskPlane(const unsigned int plane) { m_masked[plane] = true; m_fitter->maskPlane(plane); } //============================================================================= // (Re-)include a plane in the fit //============================================================================= void TbKalmanTrackFit::unmaskPlane(const unsigned int plane) { m_masked[plane] = false; m_fitter->unmaskPlane(plane); } //========================================================================= // Perform the fit //========================================================================= void TbKalmanTrackFit::fit(LHCb::TbTrack* track) { // Make a straight-line fit. m_fitter->fit(track); // Create a Kalman track. LHCb::TbKalmanTrack ktrack(*track, m_hiterror2, m_scat2); // Run the Kalman filter. ktrack.fit(); // Update the track states. track->clearStates(); auto nodes = ktrack.nodes(); for (auto it = nodes.cbegin(), end = nodes.cend(); it != end; ++it) { track->addToStates((*it)->state()); } // Set the chi2. track->setChi2PerNdof(ktrack.chi2PerNdof()); track->setNdof(ktrack.ndof()); }