Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:18:27

0001 /* Copyright 2008-2010, Technische Universitaet Muenchen,
0002              2014 Ludwig-Maximimilians-Universität München
0003    Authors: Tobias Schlüter
0004 
0005    This file is part of GENFIT.
0006 
0007    GENFIT is free software: you can redistribute it and/or modify
0008    it under the terms of the GNU Lesser General Public License as published
0009    by the Free Software Foundation, either version 3 of the License, or
0010    (at your option) any later version.
0011 
0012    GENFIT is distributed in the hope that it will be useful,
0013    but WITHOUT ANY WARRANTY; without even the implied warranty of
0014    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0015    GNU Lesser General Public License for more details.
0016 
0017    You should have received a copy of the GNU Lesser General Public License
0018    along with GENFIT.  If not, see <http://www.gnu.org/licenses/>.
0019 */
0020 /** @addtogroup genfit
0021  * @{
0022  */
0023 
0024 #ifndef genfit_WireMeasurementNew_h
0025 #define genfit_WireMeasurementNew_h
0026 
0027 #include "AbsMeasurement.h"
0028 #include "AbsHMatrix.h"
0029 #include "MeasurementOnPlane.h"
0030 
0031 
0032 namespace genfit {
0033 
0034 /** @brief Class for measurements in wire detectors (Straw tubes and drift chambers)
0035  *  which do not measure the coordinate along the wire.
0036  *
0037  *  @author Tobias Schlüter
0038  *
0039  * This is similar to WireMeasurement, but since WireMeasurement
0040  * stores a 7x7 covariance matrix for what is a one-dimensional
0041  * measurement, this class is preferable.  Protected inheritance of
0042  * rawHitCoords_ and rawHitCov_ makes it impossible to rewrite
0043  * WireMeasurement, as subclasses will access these members.
0044  *
0045  * This hit class is not valid for arbitrary choices of plane
0046  * orientation: to use it you MUST choose a plane described by u
0047  * and v axes with v coincident with the wire (and u orthogonal
0048  * to it, obviously).
0049  * The hit will be described by 7 coordinates:
0050  * w_x1, w_y1, w_z1, w_x2, w_y2, w_z2, rdrift
0051  * where w_ji (with j = x, y, z and i = 1, 2) are the wire
0052  * extremities coordinates; rdrift = distance from the wire (u
0053  * coordinate in the plane)
0054  *
0055  */
0056 class WireMeasurementNew : public AbsMeasurement {
0057 
0058  public:
0059   WireMeasurementNew();
0060   WireMeasurementNew(double driftDistance, double driftDistanceError, const TVector3& endPoint1, const TVector3& endPoint2, int detId, int hitId, TrackPoint* trackPoint);
0061 
0062   virtual ~WireMeasurementNew() {;}
0063 
0064   virtual WireMeasurementNew* clone() const override {return new WireMeasurementNew(*this);}
0065 
0066   virtual SharedPlanePtr constructPlane(const StateOnPlane& state) const override;
0067 
0068   /**  Hits with a small drift distance get a higher weight, whereas hits with
0069     * big drift distances become weighted down.
0070     * When these initial weights are used by the DAF, the smoothed track will be closer to the real
0071     * trajectory than if both sides are weighted with 0.5 regardless of the drift distance.
0072     * This helps a lot when resolving l/r ambiguities with the DAF.
0073     * The idea is that for the first iteration of the DAF, the wire positions are taken.
0074     * For small drift radii, the wire position does not bend the fit away from the
0075     * trajectory, whereas the wire position for hits with large drift radii is further away
0076     * from the trajectory and will therefore bias the fit if not weighted down.
0077     */
0078   virtual std::vector<MeasurementOnPlane*> constructMeasurementsOnPlane(const StateOnPlane& state) const override;
0079 
0080   virtual const AbsHMatrix* constructHMatrix(const AbsTrackRep*) const override;
0081 
0082   /** Reset the wire end points.
0083    */
0084   void setWireEndPoints(const TVector3& endPoint1, const TVector3& endPoint2);
0085 
0086   /** Set maximum drift distance. This is used to calculate the start weights of the two
0087    * measurementsOnPlane.
0088    */
0089   void setMaxDistance(double d){maxDistance_ = d;}
0090   /**
0091    * select how to resolve the left/right ambiguity:
0092    * -1: negative (left) side on vector (wire direction) x (track direction)
0093    * 0: mirrors enter with same weight, DAF will decide.
0094    * 1: positive (right) side on vector (wire direction) x (track direction)
0095    * where the wire direction is pointing from endPoint1 to endPoint2
0096    */
0097   void setLeftRightResolution(int lr);
0098 
0099   virtual bool isLeftRigthMeasurement() const {return true;}
0100   double getMaxDistance(){return maxDistance_;}
0101   int getLeftRightResolution() const override {return leftRight_;}
0102 
0103  protected:
0104 
0105   double wireEndPoint1_[3]; //! Wire end point 1 (X, Y, Z)
0106   double wireEndPoint2_[3]; //! Wire end point 2 (X, Y, Z)
0107   double maxDistance_;
0108   double leftRight_;
0109 
0110  public:
0111 
0112   ClassDefOverride(WireMeasurementNew, 1)
0113 
0114 };
0115 
0116 } /* End of namespace genfit */
0117 /** @} */
0118 
0119 #endif // genfit_WireMeasurementNew_h