1
/* This file is part of MAUS: http://micewww.pp.rl.ac.uk:8080/projects/maus
3
* MAUS is free software: you can redistribute it and/or modify
4
* it under the terms of the GNU General Public License as published by
5
* the Free Software Foundation, either version 3 of the License, or
6
* (at your option) any later version.
8
* MAUS is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with MAUS. If not, see <http://www.gnu.org/licenses/>.
18
#include "src/map/MapCppTrackerTrackFit/MapCppTrackerTrackFit.hh"
22
#include "src/common_cpp/API/PyWrapMapBase.hh"
23
#include "src/common_cpp/Recon/Kalman/MAUSTrackWrapper.hh"
27
PyMODINIT_FUNC init_MapCppTrackerTrackFit(void) {
28
PyWrapMapBase<MapCppTrackerTrackFit>::PyWrapMapBaseModInit
29
("MapCppTrackerTrackFit", "", "", "", "");
33
MapCppTrackerTrackFit::MapCppTrackerTrackFit() : MapBase<Data>("MapCppTrackerTrackFit"),
35
_helical_track_fitter(NULL),
36
_straight_track_fitter(NULL) {
40
MapCppTrackerTrackFit::~MapCppTrackerTrackFit() {
44
void MapCppTrackerTrackFit::_birth(const std::string& argJsonConfigDocument) {
45
// Pull out the global settings
46
if (!Globals::HasInstance()) {
47
GlobalsManager::InitialiseGlobals(argJsonConfigDocument);
49
Json::Value* json = Globals::GetConfigurationCards();
50
_kalman_on = (*json)["SciFiKalmanOn"].asBool();
51
_use_mcs = (*json)["SciFiKalman_use_MCS"].asBool();
52
_use_eloss = (*json)["SciFiKalman_use_Eloss"].asBool();
53
_use_patrec_seed = (*json)["SciFiSeedPatRec"].asBool();
54
_correct_pz = (*json)["SciFiKalmanCorrectPz"].asBool();
55
// Values used to set the track rating:
56
_excellent_num_trackpoints = (*json)["SciFiExcellentNumTrackpoints"].asInt();
57
_good_num_trackpoints = (*json)["SciFiGoodNumTrackpoints"].asInt();
58
_poor_num_trackpoints = (*json)["SciFiPoorNumTrackpoints"].asInt();
59
_excellent_p_value = (*json)["SciFiExcellentPValue"].asDouble();
60
_good_p_value = (*json)["SciFiGoodPValue"].asDouble();
61
_poor_p_value = (*json)["SciFiPoorPValue"].asDouble();
62
_excellent_num_spacepoints = (*json)["SciFiExcellentNumSpacepoints"].asInt();
63
_good_num_spacepoints = (*json)["SciFiGoodNumSpacepoints"].asInt();
64
_poor_num_spacepoints = (*json)["SciFiPoorNumSpacepoints"].asInt();
66
// Build the geometery helper instance
67
MiceModule* module = Globals::GetReconstructionMiceModules();
68
std::vector<const MiceModule*> modules =
69
module->findModulesByPropertyString("SensitiveDetector", "SciFi");
70
_geometry_helper = SciFiGeometryHelper(modules);
71
_geometry_helper.Build();
72
SciFiTrackerMap& geo_map = _geometry_helper.GeometryMap();
74
if (_use_patrec_seed) {
77
_seed_value = (*json)["SciFiSeedCovariance"].asDouble();
80
// Set up final track fit (Kalman filter)
81
HelicalPropagator* helical_prop = new HelicalPropagator(&_geometry_helper);
82
helical_prop->SetCorrectPz(_correct_pz);
83
helical_prop->SetIncludeMCS(_use_mcs);
84
helical_prop->SetSubtractELoss(_use_eloss);
85
_helical_track_fitter = new Kalman::TrackFit(helical_prop);
87
StraightPropagator* straight_prop = new StraightPropagator(&_geometry_helper);
88
straight_prop->SetIncludeMCS(_use_mcs);
89
_straight_track_fitter = new Kalman::TrackFit(straight_prop);
91
// Each measurement plane has a unique alignment and rotation => they all need their own
92
// measurement object.
93
for (SciFiTrackerMap::iterator track_it = geo_map.begin();
94
track_it != geo_map.end(); ++track_it) {
95
int tracker_const = (track_it->first == 0 ? -1 : 1);
96
for (SciFiPlaneMap::iterator plane_it = track_it->second.Planes.begin();
97
plane_it != track_it->second.Planes.end(); ++plane_it) {
99
int id = plane_it->first * tracker_const;
100
_helical_track_fitter->AddMeasurement(id,
101
new MAUS::SciFiHelicalMeasurements(plane_it->second));
102
_straight_track_fitter->AddMeasurement(id,
103
new MAUS::SciFiStraightMeasurements(plane_it->second));
109
void MapCppTrackerTrackFit::_death() {
110
if (_helical_track_fitter) {
111
delete _helical_track_fitter;
112
_helical_track_fitter = NULL;
114
if (_straight_track_fitter) {
115
delete _straight_track_fitter;
116
_straight_track_fitter = NULL;
121
void MapCppTrackerTrackFit::_process(Data* data) const {
122
Spill& spill = *(data->GetSpill());
124
/* return if not physics spill */
125
if (spill.GetDaqEventType() != "physics_event")
128
if (spill.GetReconEvents()) {
129
for (unsigned int k = 0; k < spill.GetReconEvents()->size(); k++) {
130
SciFiEvent *event = spill.GetReconEvents()->at(k)->GetSciFiEvent();
134
_set_field_values(event);
138
event->clear_scifitracks();
143
std::cout << "No recon events found\n";
147
void MapCppTrackerTrackFit::_set_field_values(SciFiEvent* event) const {
148
event->set_mean_field_up(_geometry_helper.GetFieldValue(0));
149
event->set_mean_field_down(_geometry_helper.GetFieldValue(1));
151
event->set_variance_field_up(_geometry_helper.GetFieldVariance(0));
152
event->set_variance_field_down(_geometry_helper.GetFieldVariance(1));
154
event->set_range_field_up(_geometry_helper.GetFieldRange(0));
155
event->set_range_field_down(_geometry_helper.GetFieldRange(1));
159
void MapCppTrackerTrackFit::track_fit(SciFiEvent &evt) const {
160
size_t number_helical_tracks = evt.helicalprtracks().size();
161
size_t number_straight_tracks = evt.straightprtracks().size();
162
for (size_t track_i = 0; track_i < number_helical_tracks; track_i++) {
163
SciFiHelicalPRTrack* helical = evt.helicalprtracks().at(track_i);
165
Kalman::Track data_track = BuildTrack(helical, &_geometry_helper, 5);
166
Kalman::State seed = ComputeSeed(helical, &_geometry_helper, _use_eloss, _seed_value);
168
_helical_track_fitter->SetTrack(data_track);
169
_helical_track_fitter->SetSeed(seed);
171
_helical_track_fitter->Filter(false);
172
_helical_track_fitter->Smooth(false);
174
SciFiTrack* track = ConvertToSciFiTrack(_helical_track_fitter, &_geometry_helper, helical);
175
calculate_track_rating(track);
177
evt.add_scifitrack(track);
179
for (size_t track_i = 0; track_i < number_straight_tracks; track_i++) {
180
SciFiStraightPRTrack* straight = evt.straightprtracks().at(track_i);
181
Kalman::Track data_track = BuildTrack(straight, &_geometry_helper, 4);
183
Kalman::State seed = ComputeSeed(straight, &_geometry_helper, _seed_value);
185
_straight_track_fitter->SetTrack(data_track);
186
_straight_track_fitter->SetSeed(seed);
188
_straight_track_fitter->Filter(false);
189
_straight_track_fitter->Smooth(false);
191
SciFiTrack* track = ConvertToSciFiTrack(_straight_track_fitter, &_geometry_helper, straight);
192
calculate_track_rating(track);
194
evt.add_scifitrack(track);
198
void MapCppTrackerTrackFit::calculate_track_rating(SciFiTrack* track) const {
199
SciFiBasePRTrack* pr_track = track->pr_track_pointer();
200
int number_spacepoints = pr_track->get_num_points();
201
int number_trackpoints = track->GetNumberDataPoints();
203
bool excel_numtp = (number_trackpoints >= _excellent_num_trackpoints);
204
bool good_numtp = (number_trackpoints >= _good_num_trackpoints);
205
bool poor_numtp = (number_trackpoints >= _poor_num_trackpoints);
206
bool excel_numsp = (number_spacepoints >= _excellent_num_spacepoints);
207
bool good_numsp = (number_spacepoints >= _good_num_spacepoints);
208
bool poor_numsp = (number_spacepoints >= _poor_num_spacepoints);
209
bool excel_pval = (track->P_value() >= _excellent_p_value);
210
bool good_pval = (track->P_value() >= _good_p_value);
211
bool poor_pval = (track->P_value() >= _poor_p_value);
215
if (excel_numtp && excel_numsp && excel_pval) {
217
} else if (good_numtp && good_numsp && good_pval) {
219
} else if (poor_numtp && poor_numsp && poor_pval) {
225
track->SetRating(rating);