ROOT logo
#ifndef HKalMdcHit_h
#define HKalMdcHit_h

// from ROOT
#include "TArrayD.h"
#include "TMatrixD.h"
class TRotation;
class TVector3;
#include "TVectorD.h"

// from hydra
#include "hkaldef.h"
#include "hkalmdcmeaslayer.h"

#include <iostream>
using namespace std;
#include <cstdlib>

class HKalMdcHit : public TObject {

private:

    TVectorD hitVec;             //  Measurement vector.
    TVector3 hitVec3;            //! 3 dimensional hit vector in sector coordinates.
    TVector3 wirePoint1;         //! Wire geometry.
    TVector3 wirePoint2;         //! Wire geometry.
    TVectorD errVec;             //! Error vector.
    TMatrixD fErr;               //  Error matrix.

    Double_t driftTime;          // Drift time. Used if this is a wire hit.
    Double_t driftTimeErr;       // Error of drift time. Used if this is a wire hit.

    // For writing to data container HKalHitWire only.
    // ------
    Float_t angle;       // Impact angle of reconstructed track with drift cell.
    Float_t t1;          // Drift time of first hit in ns.
    Float_t t2;          // Drift time of second hit in ns.
    Float_t tTof;        // Time of flight correction of time 1.
    Float_t tTofCal1;    // Time of flight correction of time 1 from HMdcCal1Sim.
    Float_t tWireOffset; // Travel time on wire correction of time 1.
    // ------

    HKalMdcMeasLayer *measLayer; //! Measurement layer where hit was detected.
    HKalPlane virtLayer;

    Double_t chi2;            // Distance of the observation to the smoothed track state. (Used for competing hits.)
    Double_t weight;          // Weight of the measurement compared to its competitors. (Used for competing hits.)
    TArrayD  weightsHist;     // Weight of the measurement compared to its competitors during each iteration of the DAF. (Used for competing hits.)

    Int_t    driftCell;       // Drift cell number on measurement layer.
    Int_t    hitType;         // Segment/wire hit.

protected:

    virtual void              setHitVec(const TVector3 &newhit);

    virtual void              setHitVec(const TVectorD &newhit);

public:

    HKalMdcHit(Int_t dim);

    HKalMdcHit(Double_t *hit, Double_t *err, const HKalMdcMeasLayer &layer, Int_t dim,
	       const TVector3 &impact, Kalman::kalHitTypes type, Double_t w=1., Int_t cell=-1);

    HKalMdcHit(const HKalMdcHit &hit);

    virtual ~HKalMdcHit();

    static  Bool_t areCompetitors(const HKalMdcHit &hit1, const HKalMdcHit &hit2);

    virtual Int_t  Compare       (const TObject *obj) const;

    virtual void   print         (const Option_t *opt="") const;

    virtual void   setHitAndErr  (const TVector3 &newhit, const TVector3 &newerr);

    virtual void   setHitAndErr  (const TVectorD &newhit, const TVectorD &newerr);

    virtual void   transformHit  (const TRotation &transMat);

    virtual void   transformLayer(const TRotation &transMat);

    virtual Int_t             getCell           () const { return driftCell; }

    virtual Double_t          getChi2           () const { return chi2;   }

    virtual Int_t             getDimension      () const { return hitVec.GetNrows(); }

    virtual Double_t          getDriftTime      () const { return driftTime; }

    virtual Double_t          getDriftTimeErr   () const { return driftTimeErr; }

    virtual TMatrixD const&   getErrMat         () const { return fErr; }

    virtual TVectorD const&   getErrVec         () const { return errVec; }

    virtual TVectorD const&   getHitVec         () const {  return hitVec; }

    virtual void              getHitVec3        (TVector3 &hit3) const;

    virtual Int_t             getHitType        () const { return hitType; }

    virtual Float_t           getImpactAngle    () const { return angle; }

    virtual Int_t             getLayer          () const { return measLayer->getLayer(); }

    virtual Int_t             getModule         () const { return measLayer->getModule(); }

    virtual Int_t             getSector         () const { return measLayer->getSector(); }

    virtual Float_t           getTime1          () const { return t1; }

    virtual Float_t           getTime2          () const { return t2; }

    virtual Float_t           getTimeTof        () const { return tTof; }

    virtual Float_t           getTimeTofCal1    () const { return tTofCal1; }

    virtual Float_t           getTimeWireOffset () const { return tWireOffset; }

    virtual Double_t          getWeight         () const { return weight; }

    virtual Double_t          getWeightHist     (Int_t iDaf) const { if(iDaf >= 0 && iDaf < weightsHist.GetSize()) weightsHist[iDaf]; return 0.; }

    virtual void              getWirePts        (TVector3 &wire1, TVector3 &wire2) const;

    virtual HKalMdcMeasLayer const& getMeasLayer() const { if(!measLayer) { Warning("getMeasLayer()", "Measurement layer of hit has not been set"); } return *measLayer; }

    virtual HKalPlane const&  getVirtPlane      () const { return virtLayer; }

    virtual Bool_t            IsSortable        () const { return kTRUE; }

    virtual void              setChi2           (Double_t chi)              { chi2 = chi; }

    virtual void              setDriftTime      (Double_t t, Double_t tErr) { driftTime = t; driftTimeErr = tErr;}

    virtual void              setImpactAngle    (Float_t a)                 { angle = a; }

    virtual void              setNdafs          (Int_t n)                   { weightsHist.Set(n); }

    virtual void              setTime1          (Float_t t)                 { t1 = t; }

    virtual void              setTime2          (Float_t t)                 { t2 = t; }

    virtual void              setTimeTof        (Float_t t)                 { tTof = t; }

    virtual void              setTimeTofCal1    (Float_t t)    { tTofCal1 = t; }

    virtual void              setTimeWireOffset (Float_t t)                 { tWireOffset = t; }

    virtual Bool_t            setVirtPlane      (const TVector3 &origin, const TVector3 &n) { return virtLayer.setPlane(origin, n); }

    virtual Bool_t            setVirtPlane      (const TVector3 &origin, const TVector3 &u, const TVector3 &v) { return virtLayer.setPlane(origin, u, v); }

    virtual void              setWeight         (Double_t w)                { weight = w; }

    virtual void              setWeightHist     (Double_t w, Int_t i)       { if(i >= 0 && i<weightsHist.GetSize()) weightsHist[i] = w; }

    ClassDef(HKalMdcHit, 0)
};

#endif // HKalMdcHit_h
 hkalmdchit.h:1
 hkalmdchit.h:2
 hkalmdchit.h:3
 hkalmdchit.h:4
 hkalmdchit.h:5
 hkalmdchit.h:6
 hkalmdchit.h:7
 hkalmdchit.h:8
 hkalmdchit.h:9
 hkalmdchit.h:10
 hkalmdchit.h:11
 hkalmdchit.h:12
 hkalmdchit.h:13
 hkalmdchit.h:14
 hkalmdchit.h:15
 hkalmdchit.h:16
 hkalmdchit.h:17
 hkalmdchit.h:18
 hkalmdchit.h:19
 hkalmdchit.h:20
 hkalmdchit.h:21
 hkalmdchit.h:22
 hkalmdchit.h:23
 hkalmdchit.h:24
 hkalmdchit.h:25
 hkalmdchit.h:26
 hkalmdchit.h:27
 hkalmdchit.h:28
 hkalmdchit.h:29
 hkalmdchit.h:30
 hkalmdchit.h:31
 hkalmdchit.h:32
 hkalmdchit.h:33
 hkalmdchit.h:34
 hkalmdchit.h:35
 hkalmdchit.h:36
 hkalmdchit.h:37
 hkalmdchit.h:38
 hkalmdchit.h:39
 hkalmdchit.h:40
 hkalmdchit.h:41
 hkalmdchit.h:42
 hkalmdchit.h:43
 hkalmdchit.h:44
 hkalmdchit.h:45
 hkalmdchit.h:46
 hkalmdchit.h:47
 hkalmdchit.h:48
 hkalmdchit.h:49
 hkalmdchit.h:50
 hkalmdchit.h:51
 hkalmdchit.h:52
 hkalmdchit.h:53
 hkalmdchit.h:54
 hkalmdchit.h:55
 hkalmdchit.h:56
 hkalmdchit.h:57
 hkalmdchit.h:58
 hkalmdchit.h:59
 hkalmdchit.h:60
 hkalmdchit.h:61
 hkalmdchit.h:62
 hkalmdchit.h:63
 hkalmdchit.h:64
 hkalmdchit.h:65
 hkalmdchit.h:66
 hkalmdchit.h:67
 hkalmdchit.h:68
 hkalmdchit.h:69
 hkalmdchit.h:70
 hkalmdchit.h:71
 hkalmdchit.h:72
 hkalmdchit.h:73
 hkalmdchit.h:74
 hkalmdchit.h:75
 hkalmdchit.h:76
 hkalmdchit.h:77
 hkalmdchit.h:78
 hkalmdchit.h:79
 hkalmdchit.h:80
 hkalmdchit.h:81
 hkalmdchit.h:82
 hkalmdchit.h:83
 hkalmdchit.h:84
 hkalmdchit.h:85
 hkalmdchit.h:86
 hkalmdchit.h:87
 hkalmdchit.h:88
 hkalmdchit.h:89
 hkalmdchit.h:90
 hkalmdchit.h:91
 hkalmdchit.h:92
 hkalmdchit.h:93
 hkalmdchit.h:94
 hkalmdchit.h:95
 hkalmdchit.h:96
 hkalmdchit.h:97
 hkalmdchit.h:98
 hkalmdchit.h:99
 hkalmdchit.h:100
 hkalmdchit.h:101
 hkalmdchit.h:102
 hkalmdchit.h:103
 hkalmdchit.h:104
 hkalmdchit.h:105
 hkalmdchit.h:106
 hkalmdchit.h:107
 hkalmdchit.h:108
 hkalmdchit.h:109
 hkalmdchit.h:110
 hkalmdchit.h:111
 hkalmdchit.h:112
 hkalmdchit.h:113
 hkalmdchit.h:114
 hkalmdchit.h:115
 hkalmdchit.h:116
 hkalmdchit.h:117
 hkalmdchit.h:118
 hkalmdchit.h:119
 hkalmdchit.h:120
 hkalmdchit.h:121
 hkalmdchit.h:122
 hkalmdchit.h:123
 hkalmdchit.h:124
 hkalmdchit.h:125
 hkalmdchit.h:126
 hkalmdchit.h:127
 hkalmdchit.h:128
 hkalmdchit.h:129
 hkalmdchit.h:130
 hkalmdchit.h:131
 hkalmdchit.h:132
 hkalmdchit.h:133
 hkalmdchit.h:134
 hkalmdchit.h:135
 hkalmdchit.h:136
 hkalmdchit.h:137
 hkalmdchit.h:138
 hkalmdchit.h:139
 hkalmdchit.h:140
 hkalmdchit.h:141
 hkalmdchit.h:142
 hkalmdchit.h:143
 hkalmdchit.h:144
 hkalmdchit.h:145
 hkalmdchit.h:146
 hkalmdchit.h:147
 hkalmdchit.h:148
 hkalmdchit.h:149
 hkalmdchit.h:150
 hkalmdchit.h:151
 hkalmdchit.h:152
 hkalmdchit.h:153
 hkalmdchit.h:154
 hkalmdchit.h:155
 hkalmdchit.h:156
 hkalmdchit.h:157
 hkalmdchit.h:158
 hkalmdchit.h:159
 hkalmdchit.h:160
 hkalmdchit.h:161
 hkalmdchit.h:162
 hkalmdchit.h:163