#include "TRotation.h"
#include "hmdcsizescells.h"
#include "hgeomvector.h"
#include "hkalmdchit.h"
#include <iostream>
#include <iomanip>
using namespace std;
ClassImp(HKalMdcHit)
HKalMdcHit::HKalMdcHit(Int_t dim)
: TObject(), hitVec(dim), errVec(dim), fErr(dim, dim), weightsHist(5) {
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) {
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) {
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() {
}
void HKalMdcHit::setHitVec(const TVectorD &newhit) {
Int_t dim = getDimension();
for(Int_t i = 0; i < dim; i++) {
hitVec(i) = newhit[i];
}
}
void HKalMdcHit::setHitVec(const TVector3 &newhit) {
Int_t dim = getDimension();
for(Int_t i = 0; i < dim; i++) {
hitVec(i) = newhit[i];
}
}
Bool_t HKalMdcHit::areCompetitors(const HKalMdcHit &hit1, const HKalMdcHit &hit2) {
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 {
#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 {
wire1.SetXYZ(wirePoint1.X(), wirePoint1.Y(), wirePoint1.Z());
wire2.SetXYZ(wirePoint2.X(), wirePoint2.Y(), wirePoint2.Z());
}
void HKalMdcHit::print(const Option_t *opt) const {
TString stropt(opt);
Int_t pre = cout.precision();
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) {
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) {
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) {
hitVec3 .Transform(transMat);
wirePoint1.Transform(transMat);
wirePoint2.Transform(transMat);
if(getHitType() == Kalman::kSegHit) {
setHitVec(hitVec3);
}
}
void HKalMdcHit::transformLayer(const TRotation &transMat) {
measLayer->transform(transMat);
virtLayer.transform(transMat);
}
void HKalMdcHit::getHitVec3(TVector3& hit3) const {
hit3.SetXYZ(hitVec3.X(), hitVec3.Y(), hitVec3.Z());
}