- #include "TbAlignmentMinuit0.h"
-
- DECLARE_TOOL_FACTORY(TbAlignmentMinuit0)
-
- //=============================================================================
- // Standard constructor, initializes variables
- //=============================================================================
- TbAlignmentMinuit0::TbAlignmentMinuit0(const std::string& type,
- const std::string& name,
- const IInterface* parent)
- : TbAlignmentMinuitBase(type, name, parent) {
-
- declareProperty("ReferencePlane", m_referencePlane = 999);
-
- m_dofsDefault = {true, true, false, true, true, true};
- }
-
- //=============================================================================
- // Destructor
- //=============================================================================
- TbAlignmentMinuit0::~TbAlignmentMinuit0() {}
-
- //=============================================================================
- // Calculate the chi2.
- //=============================================================================
- void TbAlignmentMinuit0::chi2(double& f, double* par, double* /*g*/) {
-
- // Assign new aligment constants
- for (auto im = m_modules.begin(), end = m_modules.end(); im != end; ++im) {
- const unsigned int i = im - m_modules.begin();
- (*im)->setAlignment(par[6 * i + 0], par[6 * i + 1], par[6 * i + 2],
- par[6 * i + 3], par[6 * i + 4], par[6 * i + 5]);
- }
-
- // Loop over tracks
- f = 0.;
- for (auto it = m_tracks.begin(), end = m_tracks.end(); it != end; ++it) {
- // Update global coordinates of the clusters
- SmartRefVector<LHCb::TbCluster> clusters = (*it)->track()->clusters();
- for (auto ic = clusters.begin(), end = clusters.end(); ic != end; ++ic) {
- Gaudi::XYZPoint pLocal((*ic)->xloc(), (*ic)->yloc(), 0.);
- const unsigned int plane = (*ic)->plane();
- Gaudi::XYZPoint pGlobal = geomSvc()->localToGlobal(pLocal, plane);
- (*ic)->setX(pGlobal.x());
- (*ic)->setY(pGlobal.y());
- (*ic)->setZ(pGlobal.z());
- }
- // Refit track with new cluster positions
- m_trackFit->fit((*it)->track());
- // Add the new track chi2 to the overall chi2
- f += (*it)->track()->chi2();
- }
- }
- //=============================================================================
- // Main alignment function.
- //=============================================================================
- void TbAlignmentMinuit0::align(
- std::vector<TbAlignmentTrack*>& alignmentTracks) {
-
- TbAlignmentMinuitBase::align(alignmentTracks);
- info() << "Minuit technique 0" << endmsg;
- double arglist[2];
- arglist[0] = 10000;
- arglist[1] = 1.e-2;
-
- for (unsigned int iteration = 0; iteration < m_nIterations; ++iteration) {
- info() << "Iteration " << iteration + 1 << "/" << m_nIterations << endmsg;
- // Align detector modules one at a time
- for (unsigned int i = 0; i < m_nPlanes; ++i) {
- // Skip reference plane and masked planes.
- if (i == m_referencePlane || masked(i)) continue;
- // Wobble this plane and fix the others.
- for (unsigned int j = 0; j < m_nPlanes; ++j) {
- if (i != j) {
- m_fitter->FixParameter(6 * j + 0); // x
- m_fitter->FixParameter(6 * j + 1); // y
- m_fitter->FixParameter(6 * j + 2); // z
- m_fitter->FixParameter(6 * j + 3); // Rx
- m_fitter->FixParameter(6 * j + 4); // Ry
- m_fitter->FixParameter(6 * j + 5); // Rz
- } else {
- info() << "*** Wobbling detector " << j << endmsg;
- for (unsigned int k = 0; k < 6; ++k) {
- if (m_dofs[k]) {
- m_fitter->ReleaseParameter(6 * j + k);
- } else {
- m_fitter->FixParameter(6 * j + k);
- }
- }
- }
- }
- // Execute minimization and calculate proper error matrix
- m_fitter->ExecuteCommand("MIGRAD", arglist, 2);
- m_fitter->ExecuteCommand("HESSE", arglist, 1);
- if (msgLevel(MSG::INFO))
- m_fitter->ExecuteCommand("SHOW PARAMETERS", 0, 0);
- }
- }
- updateGeometry();
- }