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/>.
20
#include "Recon/Global/TrackPoint.hh"
23
#include "CLHEP/Units/PhysicalConstants.h"
25
#include "DataStructure/ThreeVector.hh"
26
#include "src/common_cpp/Maths/Vector.hh"
27
#include "src/common_cpp/Simulation/MAUSPrimaryGeneratorAction.hh"
28
#include "Interface/Squeak.hh"
29
#include "Recon/Global/Detector.hh"
30
#include "Recon/Global/Particle.hh"
36
TrackPoint::TrackPoint()
38
detector_id_(MAUS::DataStructure::Global::kUndefined),
39
particle_id_(MAUS::DataStructure::Global::kNoPID),
43
TrackPoint::TrackPoint(const TrackPoint& original_instance)
44
: PhaseSpaceVector(original_instance),
45
detector_id_(original_instance.detector_id_),
46
uncertainties_(original_instance.uncertainties_),
47
particle_id_(original_instance.particle_id_),
48
z_(original_instance.z_)
51
TrackPoint::TrackPoint(const PhaseSpaceVector & original_instance,
53
const MAUS::DataStructure::Global::PID pid)
54
: PhaseSpaceVector(original_instance),
55
detector_id_(MAUS::DataStructure::Global::kUndefined),
56
particle_id_(pid), z_(z)
59
TrackPoint::TrackPoint(const Vector<double> & original_instance,
61
const MAUS::DataStructure::Global::PID pid)
62
: PhaseSpaceVector(original_instance),
63
detector_id_(MAUS::DataStructure::Global::kUndefined),
64
particle_id_(pid), z_(z)
67
TrackPoint::TrackPoint(const double time, const double energy,
68
const double x, const double px,
69
const double y, const double py,
70
const CovarianceMatrix & uncertainties,
72
: PhaseSpaceVector(time, energy, x, px, y, py),
73
detector_id_(MAUS::DataStructure::Global::kUndefined),
74
uncertainties_(uncertainties),
75
particle_id_(MAUS::DataStructure::Global::kNoPID), z_(z) { }
77
TrackPoint::TrackPoint(const double time, const double energy,
78
const double x, const double px,
79
const double y, const double py,
80
const Detector & detector,
82
: PhaseSpaceVector(time, energy, x, px, y, py),
83
detector_id_(detector.id()),
84
uncertainties_(detector.uncertainties()),
85
particle_id_(MAUS::DataStructure::Global::kNoPID), z_(z) { }
87
TrackPoint::TrackPoint(const double time, const double energy,
88
const double x, const double px,
89
const double y, const double py,
90
const MAUS::DataStructure::Global::PID particle_id,
92
: PhaseSpaceVector(time, energy, x, px, y, py),
93
detector_id_(MAUS::DataStructure::Global::kUndefined),
94
particle_id_(particle_id), z_(z) { }
96
TrackPoint::TrackPoint(double const * const array,
98
: PhaseSpaceVector(array),
99
detector_id_(MAUS::DataStructure::Global::kUndefined),
100
particle_id_(MAUS::DataStructure::Global::kNoPID), z_(z) {
103
TrackPoint::~TrackPoint() {
106
TrackPoint & TrackPoint::operator=(const TrackPoint& rhs) {
107
PhaseSpaceVector::operator=(rhs);
108
particle_id_ = rhs.particle_id_;
109
uncertainties_ = rhs.uncertainties_;
110
detector_id_ = rhs.detector_id_;
116
const bool TrackPoint::operator==(const TrackPoint& rhs) const {
117
if (static_cast<PhaseSpaceVector const * const>(this)->operator!=(rhs)) {
119
} else if (rhs.detector_id_ != detector_id_) {
121
} else if (rhs.uncertainties_ != uncertainties_) {
123
} else if (rhs.particle_id_ != particle_id_) {
125
} else if (rhs.z_ != z_) {
132
const bool TrackPoint::operator!=(const TrackPoint& rhs) const {
133
return !operator==(rhs);
136
const bool TrackPoint::operator<(const TrackPoint& rhs) const {
137
return z() < rhs.z();
140
const bool TrackPoint::operator>(const TrackPoint& rhs) const {
141
return z() > rhs.z();
144
void TrackPoint::set_particle_id(const MAUS::DataStructure::Global::PID id) {
148
MAUS::DataStructure::Global::PID TrackPoint::particle_id() const {
152
void TrackPoint::set_detector_id(
153
const MAUS::DataStructure::Global::DetectorPoint id) {
157
MAUS::DataStructure::Global::DetectorPoint TrackPoint::detector_id() const {
161
void TrackPoint::set_uncertainties(const CovarianceMatrix & uncertainties) {
162
uncertainties_ = uncertainties;
165
const CovarianceMatrix & TrackPoint::uncertainties() const {
166
return uncertainties_;
169
double TrackPoint::z_momentum() const {
170
if (particle_id_ == MAUS::DataStructure::Global::kNoPID) {
171
throw(Squeal(Squeal::recoverable,
172
"Attempting to calculate the momentum of a non-particle",
173
"MAUS::recon::global::TrackPoint::z_momentum()"));
175
const double mass = Particle::GetInstance()->GetMass(particle_id_);
176
const double energy = (*this)[1];
177
const double px = (*this)[3];
178
const double py = (*this)[5];
181
throw(Squeal(Squeal::recoverable,
182
"Attempting to calculate the momentum of a "
183
"particle that is off mass shell.",
184
"MAUS::recon::global::TrackPoint::z_momentum()"));
187
return ::sqrt(energy*energy - mass*mass - px*px - py*py);
190
MAUS::MAUSPrimaryGeneratorAction::PGParticle
191
PrimaryGeneratorParticle(const TrackPoint & point) {
192
MAUSPrimaryGeneratorAction::PGParticle particle;
193
particle.time = point.t();
194
particle.energy = point.E();
195
particle.x = point.x();
196
particle.px = point.Px();
197
particle.y = point.y();
198
particle.py = point.Py();
199
particle.z = point.z();
200
particle.pz = point.Pz();
201
particle.pid = point.particle_id();
207
std::ostream& operator<<(std::ostream& out, const TrackPoint& point) {
208
out << "t: " << point.time() << " E: " << point.energy()
209
<< " x: " << point.x() << " Px: " << point.Px()
210
<< " y: " << point.y() << " Py: " << point.Py()
211
<< " z: " << point.z()
212
<< " PID: " << point.particle_id() << " DID: " << point.detector_id()
213
<< " Uncertainties: " << point.uncertainties();
218
} // namespace global