ROOT logo

// from ROOT
#include "TRotation.h"

// from hydra
#include "hmdcsizescells.h"
#include "hgeomvector.h"

#include "hkalmdchit.h"

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

ClassImp(HKalMdcHit)

//_HADES_CLASS_DESCRIPTION
///////////////////////////////////////////////////////////////////////////////
//
// A hit point is a measurement vector.
// KalMdcHit provides the position vector of the hit with errors and the
// measurement layer of the Mini Drift Chamber where the hit was registered.
// The input for the position vector should already be in the sector coordinate
// system. The class itself won't do the transformation from layer to sector
// coordinates.
// It is recommended to make the hit vector two-dimensional. This will reduce
// the calculation time for the Kalman Filter. Since the hit must be on the
// surface of a measurement layer the third hit coordinate can be calculated.
//
//-----------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////

//  -----------------------------------
//  Ctors and Dtor
//  -----------------------------------

HKalMdcHit::HKalMdcHit(Int_t dim)
: TObject(), hitVec(dim), errVec(dim), fErr(dim, dim), weightsHist(5) {
    // Creates an empty hit object.
    // dim: dimension of hit vector

    measLayer = NULL;
}

HKalMdcHit::HKalMdcHit(Double_t *hit, Double_t *err, const HKalMdcMeasLayer &layer, Int_t dim,
        const TVector3 &impact, Kalman::kalHitTypes type, Double_t w, Int_t cell)
: TObject(), hitVec(dim), errVec(dim), fErr(dim, dim), weightsHist(5) {
      // Creates a measurement hit with arrays as input for the coordinates.
      // hit:   Measurements vector (only the first dim coordinates will be used).
      // err:   The error vector (only the first dim coordinates will be used)
      // layer: The measurement layer were the hit was detected.
      // dim:   The dimension of the hit vector.
      // impact: 3-dimensional hit vector.
      // type:   2D hit or wire hit.
      // w:      Weight of this hit (used for competing hits).
      // cell:   Drift cell number.

    for(Int_t i = 0; i < dim; i++) {
        hitVec(i) = hit[i];
        errVec(i) = err[i];
        fErr(i,i) = errVec(i) * errVec(i);
    }
    measLayer = (HKalMdcMeasLayer*)&layer;
    hitVec3   = impact;
    hitType   = type;
    weight    = w;
    driftCell = cell;

    driftTime    = -1.;
    driftTimeErr = -1.;
    angle        = 0.F;
    t1           = -1.F;
    t2           = -1.F;
    tTof         = -1.F;
    tTofCal1     = -1.F;
    tWireOffset  = -1.F;
    chi2         = -1.;

    virtLayer.setPlane(measLayer->getCenter(), measLayer->getNormal());

    if(cell >= 0) {
	HMdcSizesCells     *fSizesCells     = HMdcSizesCells::getExObject();
	if(fSizesCells == NULL) {
	    Warning("HKalMdcHit()", "HMdcSizesCells is NULL.");
	} else {
	    if(measLayer->getSector() >= 0 && measLayer->getSector() <= 5 &&
	       measLayer->getModule() >= 0 && measLayer->getModule() <= 3 &&
	       measLayer->getLayer() >= 0 && measLayer->getLayer() <= 6) {
		HMdcSizesCellsLayer &fSizesCellsLayer = (*fSizesCells)[measLayer->getSector()][measLayer->getModule()][measLayer->getLayer()];
		if(&fSizesCellsLayer == NULL) {
		    Warning("HKalMdcHit()", "No SizesCellsLayer object found.");
		    exit(1);
		}
		if(driftCell >= 0 && driftCell < fSizesCellsLayer.getNCells()) {
		    HGeomVector &wire1 = fSizesCellsLayer[driftCell].getWirePnt1();
		    wirePoint1.SetXYZ(wire1.X(), wire1.Y(), wire1.Z());
		    HGeomVector &wire2 = fSizesCellsLayer[driftCell].getWirePnt2();
		    wirePoint2.SetXYZ(wire2.X(), wire2.Y(), wire2.Z());
		} else {
		    Warning("HKalMdcHit()", Form("%d is not a valid drift cell number.", driftCell));
		}
	    } else {
		Warning("HKalMdcHit()", "Sector %i, Module %i, Layer %i not found in HMdcSizesCells.", measLayer->getSector(), measLayer->getModule(), measLayer->getLayer());
	    }
	}
    }
}

HKalMdcHit::HKalMdcHit(const HKalMdcHit &hit)
: TObject(), hitVec(hit.getDimension()), errVec(hit.getDimension()), fErr(hit.getDimension(), hit.getDimension()), weightsHist(5) {
      // Copy constructor.

    hitVec    = hit.getHitVec();
    errVec    = hit.getErrVec();
    fErr      = hit.getErrMat();

    measLayer = const_cast<HKalMdcMeasLayer*>(&(hit.getMeasLayer()));
    hit.getHitVec3(hitVec3);
    hitType   = hit.getHitType();
    weight    = hit.getWeight();
    driftCell = hit.getCell();

    driftTime    = hit.getDriftTime();
    driftTimeErr = hit.getDriftTimeErr();
    angle        = hit.getImpactAngle();
    t1           = hit.getTime1();
    t2           = hit.getTime2();
    tTof         = hit.getTimeTof();
    tTofCal1     = hit.getTimeTofCal1();
    tWireOffset  = hit.getTimeWireOffset();
    chi2         = hit.getChi2();

    virtLayer.setPlane(hit.getVirtPlane().getCenter(), hit.getVirtPlane().getNormal());
    hit.getWirePts(wirePoint1, wirePoint2);
}


HKalMdcHit::~HKalMdcHit() {
}

//  -----------------------------------
//  Implementation of protected methods
//  -----------------------------------

void HKalMdcHit::setHitVec(const TVectorD &newhit) {
    // Replace the hit vector with the coordinates stored in the parameter newhit.
    // The dimension of the object's hit vector dimension will not be changed.

    Int_t dim = getDimension();
    for(Int_t i = 0; i < dim; i++) {
        hitVec(i) = newhit[i];
    }
}

void HKalMdcHit::setHitVec(const TVector3 &newhit) {
    // Replace the hit vector with the coordinates stored in the parameter newhit.
    // The dimension of the object's hit vector dimension will not be changed.

    Int_t dim = getDimension();
    for(Int_t i = 0; i < dim; i++) {
        hitVec(i) = newhit[i];
    }
}


//  -----------------------------------
//  Implementation of public methods
//  -----------------------------------

Bool_t HKalMdcHit::areCompetitors(const HKalMdcHit &hit1, const HKalMdcHit &hit2) {
    // Checks if hit1 and hit2 are competitors, i.e. hits on the same measurement layer.

    Int_t mod1 = hit1.getMeasLayer().getModule();
    Int_t sec1 = hit1.getMeasLayer().getSector();
    Int_t lay1 = hit1.getMeasLayer().getLayer();

    Int_t mod2 = hit2.getMeasLayer().getModule();
    Int_t sec2 = hit2.getMeasLayer().getSector();
    Int_t lay2 = hit2.getMeasLayer().getLayer();

    if(mod1 == mod2 && sec1 == sec2 && lay1 == lay2) {
        return kTRUE;
    }
    return kFALSE;
}


Int_t HKalMdcHit::Compare(const TObject *obj) const {
    // Implements the Compare function from TObject parent.
    // Returns  1 if this hit's weight is greater than obj's weight.
    // Returns -1 if this hit's weight is smaller than obj's weight.
    // Return   0 if weights are equal.

#ifdef kalDebug
    if(!obj->InheritsFrom("HKalMdcHit")) {
        Warning("Compare()", "Parameter is not of class HKalMdcHit.");
        return 0;
    }
#endif

    if(getWeight() < ((const HKalMdcHit*)obj)->getWeight()) {
        return -1;
    } else if(getWeight() > ((const HKalMdcHit*)obj)->getWeight()) {
        return 1;
    }
    return 0;
}

void HKalMdcHit::getWirePts(TVector3 &wire1, TVector3 &wire2) const {
    // Return the two wire end points for this hit.

    wire1.SetXYZ(wirePoint1.X(), wirePoint1.Y(), wirePoint1.Z());
    wire2.SetXYZ(wirePoint2.X(), wirePoint2.Y(), wirePoint2.Z());
}

void HKalMdcHit::print(const Option_t *opt) const {
    // Prints information about the hit object.
    // opt: Determines what information about the object will be printed.
    // If opt contains:
    // "Hit": print hit and error vectors.
    // "Lay": print geometry information about the hit's measurement layer.
    // "Mat": print material information about the hit's measurement layer.
    // If opt is empty all of the above will be printed.

    TString stropt(opt);

    Int_t pre = cout.precision();
    // Print hit coordinates and errors.
    cout<<endl;
    cout<<"****Properties of hit object:****"<<endl;
    if(stropt.Contains("Hit", TString::kIgnoreCase) || stropt.IsNull()) {
        Int_t dim = getDimension();
        cout<<"Dimension of hit vector: "<<dim<<endl;
        for(Int_t i = 0; i < dim; i++) {
            Double_t x  = hitVec(i);
            Double_t dx = errVec(i);
            cout << "x  [" << i << "] = " << setw(8) << setprecision (5) << x;
            cout << "dx [" << i << "] = " << setw(6) << setprecision (2) << dx;
            cout << resetiosflags(ios::showpoint) << endl;
        }
    }
    if(measLayer) {
        cout<<"Hit is in measurement layer: "<<endl;
        measLayer->print(opt);
    } else {
        cout<<"No measurement layer defined."<<endl;
    }
    if(stropt.Contains("Lay", TString::kIgnoreCase) || stropt.IsNull()) {
	cout<<"Properties of virtual plane:"<<endl;
	virtLayer.print();
    }
    cout<<"****End of hit print.****"<<endl;
    cout<<setprecision(pre)<<endl;
}

void HKalMdcHit::setHitAndErr(const TVectorD &newhit, const TVectorD &newerr) {
    // Replace the hit and error vectors with the coordinates stored in the parameters
    // newhit and newerr.
    // The dimension of the object's hit vector dimension will not be changed.

    Int_t dim = getDimension();
    for(Int_t i = 0; i < dim; i++) {
        hitVec(i) = newhit[i];
        errVec(i) = newerr[i];
        fErr(i,i) = errVec(i) * errVec(i);
    }
}

void HKalMdcHit::setHitAndErr(const TVector3 &newhit, const TVector3 &newerr) {
    // Replace the hit and error vectors with the coordinates stored in the parameters
    // newhit and newerr.
    // The dimension of the object's hit vector dimension will not be changed.

    Int_t dim = getDimension();
    for(Int_t i = 0; i < dim; i++) {
        hitVec(i) = newhit[i];
        errVec(i) = newerr[i];
        fErr(i,i) = newerr[i] * newerr[i];
    }
}

void HKalMdcHit::transformHit(const TRotation &transMat) {
    // Transforms the hit vector using a rotation matrix.
    // The error vector will not be transformed.

    hitVec3   .Transform(transMat);
    wirePoint1.Transform(transMat);
    wirePoint2.Transform(transMat);
    if(getHitType() == Kalman::kSegHit) {
        setHitVec(hitVec3);
    }
}

void HKalMdcHit::transformLayer(const TRotation &transMat) {
    // Transforms the hit's measurement layer using a rotation matrix.

    measLayer->transform(transMat);
    virtLayer.transform(transMat);
}


void HKalMdcHit::getHitVec3(TVector3& hit3) const {
    // Returns the position of this hit.

    hit3.SetXYZ(hitVec3.X(), hitVec3.Y(), hitVec3.Z());
}

 hkalmdchit.cc:1
 hkalmdchit.cc:2
 hkalmdchit.cc:3
 hkalmdchit.cc:4
 hkalmdchit.cc:5
 hkalmdchit.cc:6
 hkalmdchit.cc:7
 hkalmdchit.cc:8
 hkalmdchit.cc:9
 hkalmdchit.cc:10
 hkalmdchit.cc:11
 hkalmdchit.cc:12
 hkalmdchit.cc:13
 hkalmdchit.cc:14
 hkalmdchit.cc:15
 hkalmdchit.cc:16
 hkalmdchit.cc:17
 hkalmdchit.cc:18
 hkalmdchit.cc:19
 hkalmdchit.cc:20
 hkalmdchit.cc:21
 hkalmdchit.cc:22
 hkalmdchit.cc:23
 hkalmdchit.cc:24
 hkalmdchit.cc:25
 hkalmdchit.cc:26
 hkalmdchit.cc:27
 hkalmdchit.cc:28
 hkalmdchit.cc:29
 hkalmdchit.cc:30
 hkalmdchit.cc:31
 hkalmdchit.cc:32
 hkalmdchit.cc:33
 hkalmdchit.cc:34
 hkalmdchit.cc:35
 hkalmdchit.cc:36
 hkalmdchit.cc:37
 hkalmdchit.cc:38
 hkalmdchit.cc:39
 hkalmdchit.cc:40
 hkalmdchit.cc:41
 hkalmdchit.cc:42
 hkalmdchit.cc:43
 hkalmdchit.cc:44
 hkalmdchit.cc:45
 hkalmdchit.cc:46
 hkalmdchit.cc:47
 hkalmdchit.cc:48
 hkalmdchit.cc:49
 hkalmdchit.cc:50
 hkalmdchit.cc:51
 hkalmdchit.cc:52
 hkalmdchit.cc:53
 hkalmdchit.cc:54
 hkalmdchit.cc:55
 hkalmdchit.cc:56
 hkalmdchit.cc:57
 hkalmdchit.cc:58
 hkalmdchit.cc:59
 hkalmdchit.cc:60
 hkalmdchit.cc:61
 hkalmdchit.cc:62
 hkalmdchit.cc:63
 hkalmdchit.cc:64
 hkalmdchit.cc:65
 hkalmdchit.cc:66
 hkalmdchit.cc:67
 hkalmdchit.cc:68
 hkalmdchit.cc:69
 hkalmdchit.cc:70
 hkalmdchit.cc:71
 hkalmdchit.cc:72
 hkalmdchit.cc:73
 hkalmdchit.cc:74
 hkalmdchit.cc:75
 hkalmdchit.cc:76
 hkalmdchit.cc:77
 hkalmdchit.cc:78
 hkalmdchit.cc:79
 hkalmdchit.cc:80
 hkalmdchit.cc:81
 hkalmdchit.cc:82
 hkalmdchit.cc:83
 hkalmdchit.cc:84
 hkalmdchit.cc:85
 hkalmdchit.cc:86
 hkalmdchit.cc:87
 hkalmdchit.cc:88
 hkalmdchit.cc:89
 hkalmdchit.cc:90
 hkalmdchit.cc:91
 hkalmdchit.cc:92
 hkalmdchit.cc:93
 hkalmdchit.cc:94
 hkalmdchit.cc:95
 hkalmdchit.cc:96
 hkalmdchit.cc:97
 hkalmdchit.cc:98
 hkalmdchit.cc:99
 hkalmdchit.cc:100
 hkalmdchit.cc:101
 hkalmdchit.cc:102
 hkalmdchit.cc:103
 hkalmdchit.cc:104
 hkalmdchit.cc:105
 hkalmdchit.cc:106
 hkalmdchit.cc:107
 hkalmdchit.cc:108
 hkalmdchit.cc:109
 hkalmdchit.cc:110
 hkalmdchit.cc:111
 hkalmdchit.cc:112
 hkalmdchit.cc:113
 hkalmdchit.cc:114
 hkalmdchit.cc:115
 hkalmdchit.cc:116
 hkalmdchit.cc:117
 hkalmdchit.cc:118
 hkalmdchit.cc:119
 hkalmdchit.cc:120
 hkalmdchit.cc:121
 hkalmdchit.cc:122
 hkalmdchit.cc:123
 hkalmdchit.cc:124
 hkalmdchit.cc:125
 hkalmdchit.cc:126
 hkalmdchit.cc:127
 hkalmdchit.cc:128
 hkalmdchit.cc:129
 hkalmdchit.cc:130
 hkalmdchit.cc:131
 hkalmdchit.cc:132
 hkalmdchit.cc:133
 hkalmdchit.cc:134
 hkalmdchit.cc:135
 hkalmdchit.cc:136
 hkalmdchit.cc:137
 hkalmdchit.cc:138
 hkalmdchit.cc:139
 hkalmdchit.cc:140
 hkalmdchit.cc:141
 hkalmdchit.cc:142
 hkalmdchit.cc:143
 hkalmdchit.cc:144
 hkalmdchit.cc:145
 hkalmdchit.cc:146
 hkalmdchit.cc:147
 hkalmdchit.cc:148
 hkalmdchit.cc:149
 hkalmdchit.cc:150
 hkalmdchit.cc:151
 hkalmdchit.cc:152
 hkalmdchit.cc:153
 hkalmdchit.cc:154
 hkalmdchit.cc:155
 hkalmdchit.cc:156
 hkalmdchit.cc:157
 hkalmdchit.cc:158
 hkalmdchit.cc:159
 hkalmdchit.cc:160
 hkalmdchit.cc:161
 hkalmdchit.cc:162
 hkalmdchit.cc:163
 hkalmdchit.cc:164
 hkalmdchit.cc:165
 hkalmdchit.cc:166
 hkalmdchit.cc:167
 hkalmdchit.cc:168
 hkalmdchit.cc:169
 hkalmdchit.cc:170
 hkalmdchit.cc:171
 hkalmdchit.cc:172
 hkalmdchit.cc:173
 hkalmdchit.cc:174
 hkalmdchit.cc:175
 hkalmdchit.cc:176
 hkalmdchit.cc:177
 hkalmdchit.cc:178
 hkalmdchit.cc:179
 hkalmdchit.cc:180
 hkalmdchit.cc:181
 hkalmdchit.cc:182
 hkalmdchit.cc:183
 hkalmdchit.cc:184
 hkalmdchit.cc:185
 hkalmdchit.cc:186
 hkalmdchit.cc:187
 hkalmdchit.cc:188
 hkalmdchit.cc:189
 hkalmdchit.cc:190
 hkalmdchit.cc:191
 hkalmdchit.cc:192
 hkalmdchit.cc:193
 hkalmdchit.cc:194
 hkalmdchit.cc:195
 hkalmdchit.cc:196
 hkalmdchit.cc:197
 hkalmdchit.cc:198
 hkalmdchit.cc:199
 hkalmdchit.cc:200
 hkalmdchit.cc:201
 hkalmdchit.cc:202
 hkalmdchit.cc:203
 hkalmdchit.cc:204
 hkalmdchit.cc:205
 hkalmdchit.cc:206
 hkalmdchit.cc:207
 hkalmdchit.cc:208
 hkalmdchit.cc:209
 hkalmdchit.cc:210
 hkalmdchit.cc:211
 hkalmdchit.cc:212
 hkalmdchit.cc:213
 hkalmdchit.cc:214
 hkalmdchit.cc:215
 hkalmdchit.cc:216
 hkalmdchit.cc:217
 hkalmdchit.cc:218
 hkalmdchit.cc:219
 hkalmdchit.cc:220
 hkalmdchit.cc:221
 hkalmdchit.cc:222
 hkalmdchit.cc:223
 hkalmdchit.cc:224
 hkalmdchit.cc:225
 hkalmdchit.cc:226
 hkalmdchit.cc:227
 hkalmdchit.cc:228
 hkalmdchit.cc:229
 hkalmdchit.cc:230
 hkalmdchit.cc:231
 hkalmdchit.cc:232
 hkalmdchit.cc:233
 hkalmdchit.cc:234
 hkalmdchit.cc:235
 hkalmdchit.cc:236
 hkalmdchit.cc:237
 hkalmdchit.cc:238
 hkalmdchit.cc:239
 hkalmdchit.cc:240
 hkalmdchit.cc:241
 hkalmdchit.cc:242
 hkalmdchit.cc:243
 hkalmdchit.cc:244
 hkalmdchit.cc:245
 hkalmdchit.cc:246
 hkalmdchit.cc:247
 hkalmdchit.cc:248
 hkalmdchit.cc:249
 hkalmdchit.cc:250
 hkalmdchit.cc:251
 hkalmdchit.cc:252
 hkalmdchit.cc:253
 hkalmdchit.cc:254
 hkalmdchit.cc:255
 hkalmdchit.cc:256
 hkalmdchit.cc:257
 hkalmdchit.cc:258
 hkalmdchit.cc:259
 hkalmdchit.cc:260
 hkalmdchit.cc:261
 hkalmdchit.cc:262
 hkalmdchit.cc:263
 hkalmdchit.cc:264
 hkalmdchit.cc:265
 hkalmdchit.cc:266
 hkalmdchit.cc:267
 hkalmdchit.cc:268
 hkalmdchit.cc:269
 hkalmdchit.cc:270
 hkalmdchit.cc:271
 hkalmdchit.cc:272
 hkalmdchit.cc:273
 hkalmdchit.cc:274
 hkalmdchit.cc:275
 hkalmdchit.cc:276
 hkalmdchit.cc:277
 hkalmdchit.cc:278
 hkalmdchit.cc:279
 hkalmdchit.cc:280
 hkalmdchit.cc:281
 hkalmdchit.cc:282
 hkalmdchit.cc:283
 hkalmdchit.cc:284
 hkalmdchit.cc:285
 hkalmdchit.cc:286
 hkalmdchit.cc:287
 hkalmdchit.cc:288
 hkalmdchit.cc:289
 hkalmdchit.cc:290
 hkalmdchit.cc:291
 hkalmdchit.cc:292
 hkalmdchit.cc:293
 hkalmdchit.cc:294
 hkalmdchit.cc:295
 hkalmdchit.cc:296
 hkalmdchit.cc:297
 hkalmdchit.cc:298
 hkalmdchit.cc:299
 hkalmdchit.cc:300
 hkalmdchit.cc:301
 hkalmdchit.cc:302
 hkalmdchit.cc:303
 hkalmdchit.cc:304
 hkalmdchit.cc:305
 hkalmdchit.cc:306
 hkalmdchit.cc:307