LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
GFWireHitPolicy.cxx
Go to the documentation of this file.
1 /* Copyright 2008-2010, Technische Universitaet Muenchen,
2  Authors: Christian Hoeppner & Sebastian Neubert
3 
4  This file is part of GENFIT.
5 
6  GENFIT is free software: you can redistribute it and/or modify
7  it under the terms of the GNU Lesser General Public License as published
8  by the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  GENFIT is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Lesser General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public License
17  along with GENFIT. If not, see <http://www.gnu.org/licenses/>.
18 */
19 // ----------------------------------------------------------
20 // Please see GFWireHitPolicy.h before using this class.
21 // ----------------------------------------------------------
22 
24 
25 #include <cassert>
26 #include <cmath>
27 #include <iostream>
28 
29 #include "TMath.h"
30 #include "TVector3.h"
31 
35 
36 const std::string genf::GFWireHitPolicy::fPolicyName = "GFWireHitPolicy";
37 
39 {
40  ;
41 }
42 
43 TMatrixT<Double_t> genf::GFWireHitPolicy::hitCoord(GFAbsRecoHit* hit, const GFDetPlane& plane)
44 {
45  TMatrixT<Double_t> returnMat(1, 1);
46 
47  checkPlane(hit, plane);
48 
49  // raw x1, y1, z1, x2, y2, z2, rdrift
50  TMatrixT<Double_t> rC = hit->getRawHitCoord();
51 
52  returnMat[0][0] = rC[6][0];
53  return returnMat;
54 }
55 
56 TMatrixT<Double_t> genf::GFWireHitPolicy::hitCov(GFAbsRecoHit* hit, const GFDetPlane& plane)
57 {
58  checkPlane(hit, plane);
59 
60  TMatrixT<Double_t> returnCov(1, 1);
61  TMatrixT<Double_t> rawCov = hit->getRawHitCov();
62 
63  returnCov[0][0] = rawCov[6][6];
64 
65  return returnCov;
66 }
67 
69 {
70  // raw x1, y1, z1, x2, y2, z2, rdrift, zreco
71  TMatrixT<Double_t> rC = hit->getRawHitCoord();
72 
73  assert(rC.GetNrows() == 7);
74 
75  TVector3 wire1(rC[0][0], rC[1][0], rC[2][0]);
76  TVector3 wire2(rC[3][0], rC[4][0], rC[5][0]);
77  TVector3 wiredirection = wire1 - wire2;
78 
79  TVector3 vaxis = plane.getV();
80  wiredirection.SetMag(1.);
81  vaxis.SetMag(1.);
82 
83  if (fabs(TMath::Abs(wiredirection.Dot(vaxis)) - 1) > 1e-3) {
84 
85  std::cout << "GFWireHitPolicy: plane not valid!!" << std::endl;
86  }
87 }
88 
90 {
91 
92  TMatrixT<Double_t> x = hit->getRawHitCoord();
93  assert(x.GetNrows() == 7);
94  TVector3 wire1(x[0][0], x[1][0], x[2][0]);
95  TVector3 wire2(x[3][0], x[4][0], x[5][0]);
96 
97  // distance of one (the first) of the wire extremities from the plane
98  Double_t d_from_refplane = fDetPlane.dist(wire1).Mag();
99  if (d_from_refplane < 1e-5) return fDetPlane;
100 
101  // point of closest approach
102  TVector3 poca, poca_onwire, dirInPoca;
103 
104  rep->extrapolateToLine(wire1, wire2, poca, dirInPoca, poca_onwire);
105 
106  Double_t distance;
107  distance = TMath::Sqrt(fabs(
108  ((wire1 - poca).Mag2() * (wire2 - wire1).Mag2() - pow((wire1 - poca).Dot(wire2 - wire1), 2)) /
109  (wire2 - wire1).Mag2()));
110 
111  // check poca inside tube
112  if (distance > fMaxdistance) {
113  GFException exc("distance poca-wire > maxdistance", __LINE__, __FILE__);
114  throw exc;
115  }
116 
117  // find plane
118  // unitary vector along distance
119  // poca (on track), poca_onwire (on wire)
120  TVector3 fromwiretoextr = poca - poca_onwire;
121  fromwiretoextr.SetMag(1.);
122  // unitary vector along the wire
123  TVector3 wiredirection = wire2 - wire1;
124  wiredirection.SetMag(1.);
125 
126  // check orthogonality
127  if (fabs(fromwiretoextr * wiredirection) > 1e-3) {
128  GFException exc("fromwiretoextr*wiredirection > 1e-3", __LINE__, __FILE__);
129  throw exc;
130  }
131 
132  TVector3 U;
133  U = fromwiretoextr;
134  TVector3 V;
135  V = wiredirection;
136  U.SetMag(1.);
137  V.SetMag(1.);
138 
139  TVector3 O = poca_onwire;
140 
141  fDetPlane = GFDetPlane(O, U, V);
142 
143  return fDetPlane;
144 }
145 
146 //ClassImp(GFWireHitPolicy)
Float_t x
Definition: compare.C:6
virtual void extrapolateToLine(const TVector3 &point1, const TVector3 &point2, TVector3 &poca, TVector3 &normVec, TVector3 &poca_onwire)
This method extrapolates to the point of closest approach to a line.
TVector3 dist(const TVector3 &point) const
Definition: GFDetPlane.cxx:199
const GFDetPlane & detPlane(GFAbsRecoHit *, GFAbsTrackRep *)
Get detector plane Calls GFAbsTrackRep::extrapolateToLine for POCA.
TMatrixT< Double_t > getRawHitCoord() const
Get raw hit coordinates.
Definition: GFAbsRecoHit.h:185
Base Class for genfit track representations. Defines interface for track parameterizations.
Definition: GFAbsTrackRep.h:81
void checkPlane(GFAbsRecoHit *, const GFDetPlane &)
Check if the detector plane is valid.
TMatrixT< Double_t > hitCoord(GFAbsRecoHit *, const GFDetPlane &)
Hit coordinates in detector plane.
Detector simulation of raw signals on wires.
Exception class for error handling in GENFIT (provides storage for diagnostic information) ...
Definition: GFException.h:47
TMatrixT< Double_t > hitCov(GFAbsRecoHit *, const GFDetPlane &)
Hit covariances in detector plane.
TVector3 getV() const
Definition: GFDetPlane.h:79
Float_t e
Definition: plot.C:35
TMatrixT< Double_t > getRawHitCov() const
Get raw hit covariances.
Definition: GFAbsRecoHit.h:180
static const std::string fPolicyName