KHitWireX.cxx
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////
2 ///
3 /// \file KHitWireX.cxx
4 ///
5 /// \brief Kalman filter wire-time measurement on a SurfWireX surface.
6 ///
7 /// \author H. Greenlee
8 ///
9 ////////////////////////////////////////////////////////////////////////
10 
12 #include "cetlib_except/exception.h"
16 
17 namespace trkf {
18 
19  /// Constructor.
20  ///
21  /// Arguments:
22  ///
23  /// hit - Hit.
24  /// psurf - Measurement surface (can be null).
25  ///
26  /// The measurement surface is only a suggestion. It is allowed to
27  /// be specified to allow measurements to whare surfaces to save
28  /// memory.
29  ///
32  const std::shared_ptr<const Surface>& psurf)
33  : KHit(psurf), fHit(hit)
34  {
35  // Extract wire id.
36  geo::WireID wireid = hit->WireID();
37 
38  // Check the surface (determined by wire id). If the
39  // surface pointer is null, make a new SurfWireX surface and
40  // update the base class appropriately. Otherwise, just check
41  // that the specified surface agrees with the wire id.
42 
43  if (psurf.get() == 0) {
44  std::shared_ptr<const Surface> new_psurf(new SurfWireX(wireid));
45  setMeasSurface(new_psurf);
46  }
47  else {
48  SurfWireX check_surf(wireid);
49  if (!check_surf.isEqual(*psurf))
50  throw cet::exception("KHitWireX") << "Measurement surface doesn't match wire id.\n";
51  }
52 
53  setMeasPlane(hit->WireID().Plane);
54 
55  // Extract time information from hit.
56 
57  double t = hit->PeakTime();
58  double terr = hit->RMS(); // hit->SigmaPeakTime();
59 
60  // Don't let the time error be less than 1./sqrt(12.) ticks.
61  // This should be removed when hit errors are fixed.
62 
63  if (terr < 1. / std::sqrt(12.)) terr = 1. / std::sqrt(12.);
64 
65  // Calculate position and error.
66 
67  double x =
68  detProp.ConvertTicksToX(t, hit->WireID().Plane, hit->WireID().TPC, hit->WireID().Cryostat);
69  double xerr = terr * detProp.GetXTicksCoefficient();
70 
71  // Update measurement vector and error matrix.
72 
73  trkf::KVector<1>::type mvec(1, x);
74  setMeasVector(mvec);
75 
77  merr(0, 0) = xerr * xerr;
78  setMeasError(merr);
79 
80  // Set the unique id from a combination of the channel number and the time.
81 
82  fID = (hit->Channel() % 200000) * 10000 + (int(std::abs(t)) % 10000);
83  }
84 
85  /// Constructor.
86  ///
87  /// Arguments:
88  ///
89  /// wireid - Wire id.
90  /// x - X coordinate.
91  /// xerr - X error.
92  ///
93  KHitWireX::KHitWireX(const geo::WireID& wireid, double x, double xerr)
94  : KHit(std::shared_ptr<const Surface>(new SurfWireX(wireid)))
95  {
96  // Get services.
97 
99 
100  // Get plane number.
101 
102  setMeasPlane(wireid.Plane);
103 
104  // Update measurement vector and error matrix.
105 
106  trkf::KVector<1>::type mvec(1, x);
107  setMeasVector(mvec);
108 
110  merr(0, 0) = xerr * xerr;
111  setMeasError(merr);
112  }
113 
114  bool
116  KVector<1>::type& pvec,
117  KSymMatrix<1>::type& perr,
118  KHMatrix<1>::type& hmatrix) const
119  {
120  // Make sure that the track surface and the measurement surface are the
121  // same. Throw an exception if they are not.
122 
123  if (!getMeasSurface()->isEqual(*tre.getSurface()))
124  throw cet::exception("KHitWireX") << "Track surface not the same as measurement surface.\n";
125 
126  // Prediction is just u track perameter and error.
127 
128  int size = tre.getVector().size();
129  pvec.resize(1, /* preserve */ false);
130  pvec.clear();
131  pvec(0) = tre.getVector()(0);
132 
133  perr.resize(1, /* preserve */ false);
134  perr.clear();
135  perr(0, 0) = tre.getError()(0, 0);
136 
137  // Update prediction error to include contribution from track slope.
138 
140  double pitch = geom->WirePitch();
141  double slope = tre.getVector()(2);
142  double slopevar = pitch * pitch * slope * slope / 12.;
143  perr(0, 0) += slopevar;
144 
145  // Hmatrix - du/du = 1., all others are zero.
146 
147  hmatrix.resize(1, size, /* preserve */ false);
148  hmatrix.clear();
149  hmatrix(0, 0) = 1.;
150 
151  return true;
152  }
153 } // end namespace trkf
void setMeasSurface(const std::shared_ptr< const Surface > &psurf)
Measurement surface.
Definition: KHitBase.h:114
ublas::symmetric_matrix< double, ublas::lower, ublas::row_major, ublas::bounded_array< double, N *(N+1)/2 > > type
const TrackError & getError() const
Track error matrix.
Definition: KETrack.h:53
bool isEqual(float x1, float x2)
const std::shared_ptr< const Surface > & getSurface() const
Surface.
Definition: KTrack.h:55
double GetXTicksCoefficient(int t, int c) const
geo::WireID WireID() const
Definition: Hit.h:233
float RMS() const
RMS of the hit shape, in tick units.
Definition: Hit.h:220
Kalman filter wire-time measurement on a SurfWireX surface.
CryostatID_t Cryostat
Index of cryostat.
Definition: geo_types.h:212
STL namespace.
geo::Length_t WirePitch(geo::PlaneID const &planeid) const
Returns the distance between two consecutive wires.
art framework interface to geometry description
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.
Definition: StdUtils.h:92
KMatrix< N, 5 >::type type
void setMeasVector(const typename KVector< N >::type &mvec)
Set measurement vector.
Definition: KHit.h:94
T abs(T value)
ublas::vector< double, ublas::bounded_array< double, N > > type
KHitWireX(const detinfo::DetectorPropertiesData &detProp, const art::Ptr< recob::Hit > &hit, const std::shared_ptr< const Surface > &psurf)
Constructor from Hit.
Definition: KHitWireX.cxx:30
void setMeasError(const typename KSymMatrix< N >::type &merr)
Set measurement error.
Definition: KHit.h:101
PlaneID_t Plane
Index of the plane within its TPC.
Definition: geo_types.h:493
Detector simulation of raw signals on wires.
int fID
Unique id.
Definition: KHitBase.h:147
double ConvertTicksToX(double ticks, int p, int t, int c) const
float PeakTime() const
Time of the signal peak, in tick units.
Definition: Hit.h:218
const TrackVector & getVector() const
Track state vector.
Definition: KTrack.h:56
virtual bool isEqual(const Surface &surf) const
Test two surfaces for equality, within tolerance.
void setMeasPlane(int plane)
Measurement plane.
Definition: KHitBase.h:121
bool subpredict(const KETrack &tre, KVector< 1 >::type &pvec, KSymMatrix< 1 >::type &perr, KHMatrix< 1 >::type &hmatrix) const override
Definition: KHitWireX.cxx:115
list x
Definition: train.py:276
TPCID_t TPC
Index of the TPC within its cryostat.
Definition: geo_types.h:406
raw::ChannelID_t Channel() const
ID of the readout channel the hit was extracted from.
Definition: Hit.h:230
Planar surface defined by wire id and x-axis.
const std::shared_ptr< const Surface > & getMeasSurface() const
Measurement surface.
Definition: KHitBase.h:91
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33