1 #ifndef TRAJECTORYMCSFITTER_H
2 #define TRAJECTORYMCSFITTER_H
4 #include "fhiclcpp/ParameterSet.h"
5 #include "fhiclcpp/types/Atom.h"
6 #include "fhiclcpp/types/Table.h"
7 #include "canvas/Persistency/Common/Ptr.h"
41 Name(
"pIdHypothesis"),
42 Comment(
"Default particle Id Hypothesis to be used in the fit when not specified."),
46 Name(
"minNumSegments"),
47 Comment(
"Minimum number of segments the track is split into."),
51 Name(
"segmentLength"),
52 Comment(
"Nominal length of track segments used in the fit."),
56 Name(
"minHitsPerSegment"),
57 Comment(
"Exclude segments with less hits than this value."),
62 Comment(
"Number of steps for computing energy loss uptream to current segment."),
67 Comment(
"Default is MPV Landau. Choose 1 for MIP (constant); 2 for Bethe-Bloch."),
72 Comment(
"Minimum momentum value in likelihood scan."),
77 Comment(
"Maximum momentum value in likelihood scan."),
82 Comment(
"Step in momentum value in likelihood scan."),
87 Comment(
"Angular resolution parameter used in modified Highland formula. Unit is mrad."),
93 TrajectoryMCSFitter(
int pIdHyp,
int minNSegs,
double segLen,
int minHitsPerSegment,
int nElossSteps,
int eLossMode,
double pMin,
double pMax,
double pStep,
double angResol){
106 :
TrajectoryMCSFitter(p().pIdHypothesis(),p().minNumSegments(),p().segmentLength(),p().minHitsPerSegment(),p().nElossSteps(),p().eLossMode(),p().pMin(),p().pMax(),p().pStep(),p().angResol()) {}
117 return fitMcs(tt,pid,momDepConst);
122 double mcsLikelihood(
double p,
double theta0x, std::vector<float>& dthetaij, std::vector<float>& seg_nradl, std::vector<float>& cumLen,
bool fwd,
bool momDepConst,
int pid)
const;
130 const ScanResult doLikelihoodScan(std::vector<float>& dtheta, std::vector<float>& seg_nradlengths, std::vector<float>& cumLen,
bool fwdFit,
bool momDepConst,
int pid)
const;
134 constexpr
double a = 0.1049;
135 constexpr
double c = 11.0038;
136 return (a/(p*p)) + c;
139 if (
abs(pid)==13) {
return mumass; }
140 if (
abs(pid)==211) {
return pimass; }
141 if (
abs(pid)==321) {
return kmass; }
142 if (
abs(pid)==2212) {
return pmass; }
146 double energyLossLandau(
const double mass2,
const double E2,
const double x)
const;
148 double GetE(
const double initial_E,
const double length_travelled,
const double mass)
const;
fhicl::Atom< int > minNumSegments
double energyLossLandau(const double mass2, const double E2, const double x) const
process_name opflash particleana ie x
fhicl::Atom< double > pMax
void breakTrajInSegments(const recob::TrackTrajectory &traj, std::vector< size_t > &breakpoints, std::vector< float > &segradlengths, std::vector< float > &cumseglens) const
const recob::TrackTrajectory & Trajectory() const
Access to the stored recob::TrackTrajectory.
double mcsLikelihood(double p, double theta0x, std::vector< float > &dthetaij, std::vector< float > &seg_nradl, std::vector< float > &cumLen, bool fwd, bool momDepConst, int pid) const
TrajectoryMCSFitter(const Parameters &p)
process_name use argoneut_mc_hitfinder track
recob::MCSFitResult fitMcs(const recob::Track &track, int pid, bool momDepConst=true) const
ScanResult(double ap, double apUnc, double alogL)
double mass(int pid) const
fhicl::Atom< double > pMin
void linearRegression(const recob::TrackTrajectory &traj, const size_t firstPoint, const size_t lastPoint, recob::tracking::Vector_t &pcdir) const
recob::MCSFitResult fitMcs(const recob::Trajectory &traj, bool momDepConst=true) const
fhicl::Atom< int > eLossMode
const ScanResult doLikelihoodScan(std::vector< float > &dtheta, std::vector< float > &seg_nradlengths, std::vector< float > &cumLen, bool fwdFit, bool momDepConst, int pid) const
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< Coord_t >, ROOT::Math::GlobalCoordinateSystemTag > Vector_t
Type for representation of momenta in 3D space. See recob::tracking::Coord_t for more details on the ...
TrajectoryMCSFitter(int pIdHyp, int minNSegs, double segLen, int minHitsPerSegment, int nElossSteps, int eLossMode, double pMin, double pMax, double pStep, double angResol)
size_t NPoints() const
Returns the number of stored trajectory points.
A trajectory in space reconstructed from hits.
fhicl::Atom< double > angResol
double MomentumDependentConstant(const double p) const
fhicl::Atom< double > pStep
fhicl::Atom< int > pIdHypothesis
double GetE(const double initial_E, const double length_travelled, const double mass) const
BEGIN_PROLOG vertical distance to the surface Name
std::vector< PointFlags_t > Flags_t
Type of point flag list.
recob::MCSFitResult fitMcs(const recob::Track &track, bool momDepConst=true) const
Provides recob::Track data product.
Class storing the result of the Maximum Likelihood fit of Multiple Coulomb Scattering angles between ...
fhicl::Atom< double > segmentLength
A trajectory in space reconstructed from hits.
fhicl::Atom< int > nElossSteps
fhicl::Atom< int > minHitsPerSegment
double energyLossBetheBloch(const double mass, const double e2) const
recob::MCSFitResult fitMcs(const recob::TrackTrajectory &traj, bool momDepConst=true) const
recob::MCSFitResult fitMcs(const recob::Trajectory &traj, int pid, bool momDepConst=true) const
constexpr double kBogusD
obviously bogus double value
fhicl::Table< Config > Parameters
Track from a non-cascading particle.A recob::Track consists of a recob::TrackTrajectory, plus additional members relevant for a "fitted" track: