/* This file is part of MAUS: http://micewww.pp.rl.ac.uk:8080/projects/maus * * MAUS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MAUS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MAUS. If not, see . * */ #ifndef MAUS_TRACK_WRAPPER_HH #define MAUS_TRACK_WRAPPER_HH #include "src/common_cpp/Recon/SciFi/SciFiGeometryHelper.hh" #include "src/common_cpp/Recon/Kalman/KalmanTrack.hh" #include "src/common_cpp/Recon/Kalman/KalmanTrackFit.hh" #include "src/common_cpp/DataStructure/SciFiEvent.hh" // Includes everything! #include "src/common_cpp/DataStructure/SciFiTrack.hh" #include "src/common_cpp/DataStructure/SciFiBasePRTrack.hh" #include "src/common_cpp/DataStructure/SciFiHelicalPRTrack.hh" #include "src/common_cpp/DataStructure/SciFiStraightPRTrack.hh" /** * This file contains useful functions for interfacing the Kalman filter * routines with the rest of MAUS. * * Specifically this involves converting Kalman Tracks to Scifi Tracks, or * similar; or the creation of the seed state. */ namespace MAUS { /** @brief Create a seed from a helical track */ Kalman::State ComputeSeed(SciFiHelicalPRTrack* h_track, const SciFiGeometryHelper* geom, bool correct_energy_loss = true, double seed_cov = -1.0); /** @brief Create a seed from a straight track */ Kalman::State ComputeSeed(SciFiStraightPRTrack* s_track, const SciFiGeometryHelper* geom, double seed_cov = -1.0); /** @brief Convert a KalmanTrack to a SciFiTrack for the data structure */ SciFiTrack* ConvertToSciFiTrack(const Kalman::TrackFit* fitter, const SciFiGeometryHelper* geom, SciFiBasePRTrack* pr_track); /** @brief Builds a data track using a PR track */ template Kalman::Track BuildTrack(PR_TYPE* pr_track, const SciFiGeometryHelper* geom, int dimension); /** @brief Builds a data track using an array of spacepoints */ Kalman::Track BuildSpacepointTrack(SciFiSpacePointPArray spacepoints, const SciFiGeometryHelper* geom, int dimension, int plane_num = 0, double smear = 0.2); //////////////////////////////////////////////////////////////////////////////// // Template Definitions //////////////////////////////////////////////////////////////////////////////// template Kalman::Track BuildTrack(PR_TYPE* pr_track, const SciFiGeometryHelper* geom, int dim) { SciFiSpacePointPArray spacepoints = pr_track->get_spacepoints_pointers(); Kalman::Track new_track(dim); const SciFiPlaneMap& geom_map = geom->GeometryMap().find( pr_track->get_tracker())->second.Planes; int tracker_const = (pr_track->get_tracker() == 0 ? -1 : 1); for (SciFiPlaneMap::const_iterator iter = geom_map.begin(); iter != geom_map.end(); ++iter) { int id = iter->first * tracker_const; Kalman::TrackPoint new_trackpoint = Kalman::TrackPoint(dim, 1, iter->second.Position.z(), id); new_track.Append(new_trackpoint); } size_t numb_spacepoints = spacepoints.size(); for (size_t i = 0; i < numb_spacepoints; ++i) { SciFiSpacePoint *spacepoint = spacepoints[i]; size_t numbclusters = spacepoint->get_channels()->GetLast() + 1; for (size_t j = 0; j < numbclusters; ++j) { SciFiCluster* cluster = static_cast(spacepoint->get_channels()->At(j)); int id = (cluster->get_station() - 1)*3 + cluster->get_plane(); // Actually (id - 1) TMatrixD state_vector(1, 1); TMatrixD covariance(1, 1); state_vector(0, 0) = cluster->get_alpha(); covariance(0, 0) = geom->GetChannelWidth() * geom->GetChannelWidth() / 12.0; new_track[id].SetData(Kalman::State(state_vector, covariance)); } } return new_track; } Kalman::Track BuildTrack(SciFiClusterPArray pr_track, const SciFiGeometryHelper* geom, int dimension); } // namespace MAUS #endif // MAUS_TRACK_WRAPPER_HH