9 #include <tracking/modules/mcTrackCandClassifier/MCTrackCandClassifierModule.h>
11 #include <pxd/dataobjects/PXDTrueHit.h>
12 #include <pxd/dataobjects/PXDCluster.h>
13 #include <svd/dataobjects/SVDTrueHit.h>
14 #include <svd/dataobjects/SVDCluster.h>
15 #include <vxd/geometry/GeoCache.h>
17 #include <framework/datastore/StoreArray.h>
18 #include <framework/geometry/B2Vector3.h>
19 #include <framework/geometry/BFieldManager.h>
21 #include <genfit/TrackCand.h>
23 #include <boost/foreach.hpp>
33 MCTrackCandClassifierModule::MCTrackCandClassifierModule() :
Module()
35 , m_rootFilePtr(nullptr)
38 setDescription(
"This module is meant to classify the MCTrackCands as either ideal, fine and nasty");
39 setPropertyFlags(c_ParallelProcessingCertified);
41 addParam(
"MCParticlesName", m_mcParticlesName,
42 "Name of MC Particle collection.",
45 addParam(
"MCTrackCandCollName", m_mcTrackCandsColName,
46 "Name of the input collection of MC track candidates",
49 addParam(
"rootFileName", m_rootFileName,
50 "Name of the root file",
51 std::string(
"MCTrackCandClassifier.root"));
53 addParam(
"isInAnnulusCriterium", m_applyAnnulus,
54 "Require that the hit is in the expected annulus",
56 addParam(
"isInSemiplaneCriterium", m_applySemiplane,
57 "Require that the hit is in the expected semiplane",
59 addParam(
"isInFirstLapCriterium", m_applyLap,
60 "Require that the hit belong to the first lap in the transverse plane",
62 addParam(
"isInWedgePartCriterium", m_applyWedge,
63 "Require that the hit belong to the barrel part of the SVD",
65 addParam(
"removeBadHits", m_removeBadHits,
66 "Remove the clusters that do not satisfy the criteria from the idealMCTrackCands",
69 addParam(
"minNhits", m_minHit,
70 "Minimum number of 1D Clusters to classify the MCTrackCand as ideal",
73 addParam(
"nSigma_dR", m_nSigma,
"n sigma dR",
int(3));
75 addParam(
"lapFraction", m_fraction,
"Fraction of lap",
double(1));
77 addParam(
"usePXD", m_usePXD,
"Use the PXD or not",
bool(
true));
81 void MCTrackCandClassifierModule::initialize()
111 Double_t bins_pt[9 + 1] = {0, 0.05, 0.1, 0.15, 0.2, 0.3, 0.5, 1, 2, 3.5};
112 Double_t bins_theta[10 + 1] = {0, 0.25, 0.5, 0.75, 0.75 + 0.32, 0.75 + 2 * 0.32, 0.75 + 3 * 0.32, 0.75 + 4 * 0.32, 0.75 + 5 * 0.32, 2.65, TMath::Pi()};
113 Double_t bins_lambda[10 + 1];
114 Double_t width_lambda = TMath::Pi() / 10;
115 Double_t bins_phi[14 + 1];
116 Double_t width_phi = 2 * TMath::Pi() / 14;
117 for (
int bin = 0; bin < 14 + 1; bin++)
118 bins_phi[bin] = - TMath::Pi() + bin * width_phi;
120 for (
int bin = 0; bin < 10 + 1; bin++) {
121 bins_lambda[bin] = - TMath::Pi() / 2 + bin * width_lambda;
122 B2DEBUG(1, bins_lambda[bin] <<
" " << bins_theta[bin]);
126 9, bins_pt,
"p_{t} (GeV/c)",
127 10, bins_lambda,
"#lambda",
128 14, bins_phi,
"#phi" );
131 "entry per idealMCTrackCand",
135 "entry per MCTrackCand",
139 m_h1_thetaMS_SVD =
new TH1F(
"h1thetaMS_SVD",
"Multiple Scattering Angle (SVD)", 500, 0, 500);
145 m_h1_dR =
new TH1F(
"h1dR",
"dR, annulus half width", 1000, 0, 5);
147 m_h1_dR->GetXaxis()->SetTitle(
"dR (cm)");
149 m_h1_dRoverR =
new TH1F(
"h1dRoverR",
"dR over helix radius", 1000, 0, 0.1);
153 m_h1_distOVERdR =
new TH1F(
"h1distOVERdR",
"(hit radius - helix radius)/dR", 100, -5, 5);
173 m_h1_lapTime =
new TH1F(
"h1LapTime",
"lap time", 200, 0, 100);
179 m_h1_diffOVERlap =
new TH1F(
"h1HitDiffOVERlap",
"Hit Time Difference over Lap Time",
184 m_h1_nGoodTrueHits =
new TH1F(
"h1nTrueHitsGoods",
"Number of True Hits for Accepted Tracks", 20, 0, 20);
188 m_h1_nBadTrueHits =
new TH1F(
"h1nTrueHitsBads",
"Number of True Hits for Rejected Tracks", 10, 0, 10);
192 m_h1_nGood1dInfo =
new TH1F(
"h1nGood1Dinfo",
"Number of 1D Info for Accepted Tracks", 20, 0, 20);
196 m_h1_nBad1dInfo =
new TH1F(
"h1nBad1Dinfo",
"Number of 1D Info for Rejected Tracks", 20, 0, 20);
224 B2DEBUG(1,
"+++++ 1. loop on MCTrackCands");
236 int nGoodTrueHits = 0;
237 int nBadTrueHits = 0;
240 B2DEBUG(1,
" a NEW MCTrackCand ");
245 B2DEBUG(1,
"~~~ " << MCParticles_fromMCTrackCand.
size() <<
" MCParticles related to this MCTrackCand");
246 for (
int mcp = 0; mcp < (int)MCParticles_fromMCTrackCand.
size(); mcp++) {
248 MCParticle mcParticle = *MCParticles_fromMCTrackCand[mcp];
250 B2DEBUG(1,
" a NEW charged MC Particle, " << mcParticle.
getIndex() <<
", " << mcParticle.
getPDG());
257 double omega = mcParticleInfo.
getOmega();
258 double px = mom.Px();
259 double py = mom.Py();
260 double pt = mom.Pt();
261 double x = decayVertex.X();
262 double y = decayVertex.Y();
263 double R = 1 / abs(omega);
267 double alpha = R / pt * charge;
268 double Cx = x + alpha * py;
269 double Cy = y - alpha * px;
271 TVector3 center(Cx, Cy, 0);
274 int Nhits = mcTrackCand.getNHits();
278 bool hasTrueHit =
true;
279 bool isAccepted =
true;
280 int firstRejectedHit = Nhits + 1;
281 double prevHitRadius = abs(1 / omega);
283 double lapTime = 2 * M_PI * mcParticle.
getEnergy() / 0.299792 / magField.
Z();
284 double FirstHitTime = -1;
287 bool isFirstSVDhit =
true;
289 while (cluster < Nhits && isAccepted && hasTrueHit) {
291 mcTrackCand.getHit(cluster, detId, hitId);
293 bool hasPXDCluster =
false;
294 bool hasSVDuCluster =
false;
295 bool hasSVDvCluster =
false;
303 if (detId == Const::PXD &&
m_usePXD) {
307 if (PXDTrueHit_fromPXDCluster.
size() == 0) {
308 B2WARNING(
"What's happening?!? no True Hit associated to the PXD Cluster");
314 PXDTrueHit* aPXDTrueHit = PXDTrueHit_fromPXDCluster[0];
318 uCoor = aPXDTrueHit->
getU();
319 vCoor = aPXDTrueHit->
getV();
323 HitTime = FirstHitTime;
327 hasPXDCluster =
true;
328 }
else if (detId == Const::SVD) {
331 if (SVDTrueHit_fromSVDCluster.
size() == 0) {
332 B2WARNING(
"What's happening?!? no True Hit associated to the SVD Cluster");
338 SVDTrueHit* aSVDTrueHit = SVDTrueHit_fromSVDCluster[0];
343 uCoor = aSVDTrueHit->
getU();
344 vCoor = aSVDTrueHit->
getV();
348 HitTime = FirstHitTime;
349 isFirstSVDhit =
false;
354 hasSVDuCluster =
true;
356 hasSVDvCluster =
true;
363 bool accepted4 =
true;
372 TVector3 globalHit = aSensorInfo.
pointToGlobal(TVector3(uCoor, vCoor, 0),
true);
375 bool accepted1 =
true;
380 B2DEBUG(1,
" semiplane: ACCEPTED");
382 B2DEBUG(1,
" semiplane: REJECTED, next track");
391 bool accepted2 =
true;
393 accepted2 =
isInAnnulus(hitRadius, prevHitRadius, dR);
395 prevHitRadius = hitRadius;
398 B2DEBUG(1,
" annulus: ACCEPTED");
400 B2DEBUG(1,
" annulus: REJECTED, next track");
403 bool accepted3 =
true;
405 accepted3 =
isFirstLap(FirstHitTime, HitTime, lapTime);
408 B2DEBUG(1,
" lapTime: ACCEPTED");
410 B2DEBUG(1,
" lapTime: REJECTED, next track");
413 if (accepted2 && accepted1 && accepted3 && accepted4) {
422 firstRejectedHit = cluster;
435 if (hasPXDCluster || hasSVDuCluster || hasSVDvCluster)
436 B2DEBUG(1,
"cluster: ACCEPTED (" << nGood1Dinfo <<
")");
442 B2DEBUG(1,
" idealMCTrackCand FOUND!! " << nGood1Dinfo <<
" 1D infos (" << nGoodTrueHits <<
" good true hits)");
449 if ((
int)firstRejectedHit <= (
int)mcTrackCand.getNHits()) {
450 tmpTrackCand->
reset();
451 for (
int hit = 0; hit < firstRejectedHit; hit++)
452 if (mcTrackCand.getHit(hit))
453 tmpTrackCand->addHit(mcTrackCand.getHit(hit));
456 idealMCTrackCands.
appendNew(*tmpTrackCand);
461 B2DEBUG(1,
" too few good hits (" << nGood1Dinfo <<
") to track this one ( vs " << nGoodTrueHits <<
" true hits)");
474 B2INFO(
"** MCTrackCandClassifier parameters **");
476 B2INFO(
"use PXD informations = " <<
m_usePXD);
477 B2INFO(
"--> classification criteria:");
479 B2INFO(
" -) |d - R| < " <<
m_nSigma <<
" dL thetaMS");
481 B2INFO(
" -) hit in the expected semiplane");
483 B2INFO(
" -) HitTime < " <<
m_fraction <<
" lap time");
485 B2INFO(
" -) hit must be in the barrel part of the VXD");
493 double efficiency = num / den ;
494 double efficiencyErr = sqrt(efficiency * (1 - efficiency)) / sqrt(den);
497 B2INFO(
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
498 B2INFO(
"~ MCTrackCandClassifier ~ SHORT SUMMARY ~");
500 B2INFO(
" + overall:");
501 B2INFO(
" fraction of ideal MCTrackCands = (" << efficiency * 100 <<
" +/- " << efficiencyErr * 100 <<
")% ");
503 B2INFO(
" # idealMCTrackCand = " << num);
504 B2INFO(
" # MCTrackCand = " << den);
505 B2INFO(
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
507 B2DEBUG(1,
" nWedge = " <<
nWedge);
508 B2DEBUG(1,
" nBarrel = " <<
nBarrel);
522 while ((obj = nextH()))
532 TVector3 err = center - vertex;
534 double semiPlane = err.Y() / err.X() * hit.X() + err.Y() / err.X() * vertex.x() - vertex.Y();
537 B2DEBUG(1,
" SEMI-PLANE defined by: y + " << err.Y() / err.X() <<
" x + " << err.Y() / err.X()*vertex.x() - vertex.Y() <<
" = 0");
538 B2DEBUG(1,
" with: center(" << center.X() <<
"," << center.Y() <<
")");
539 B2DEBUG(1,
" decayV(" << vertex.X() <<
"," << vertex.Y() <<
")");
540 B2DEBUG(1,
" vector(" << err.X() <<
"," << err.Y() <<
")");
541 B2DEBUG(1,
" y SLOPE = " <<
semiPlane <<
" VS y HIT = " << hit.Y());
542 B2DEBUG(1,
" HIT - SLOPE = " << -
semiPlane + hit.Y());
544 if (vertex.X() < center.X())
562 double xSquared = TMath::Power(center.X() - hit.X(), 2);
563 double ySquared = TMath::Power(center.Y() - hit.Y(), 2);
565 return TMath::Sqrt(xSquared + ySquared);
571 bool accepted =
false;
574 B2DEBUG(1,
" ANNULUS defined between radii: " << R - dR <<
" and " << R + dR);
575 B2DEBUG(1,
" hit distance = " << hitDistance);
576 B2DEBUG(1,
" helix radius = " << R);
577 B2DEBUG(1,
" dR = " << dR);
579 if ((hitDistance > R - dR) && (hitDistance < R + dR))
588 bool accepted =
false;
591 B2DEBUG(1,
" lapTime: " << LapTime);
592 B2DEBUG(1,
" FirstHitTime = " << FirstHitTime);
593 B2DEBUG(1,
" HitTime = " << HitTime);
594 B2DEBUG(1,
" difference = " << HitTime - FirstHitTime);
600 if (HitTime - FirstHitTime <
m_fraction * LapTime)
608 Int_t nbinsX, Double_t minX, Double_t maxX,
610 Int_t nbinsY, Double_t minY, Double_t maxY,
612 Int_t nbinsZ, Double_t minZ, Double_t maxZ,
616 TH3F* h =
new TH3F(name, title, nbinsX, minX, maxX, nbinsY, minY, maxY, nbinsZ, minZ, maxZ);
618 h->GetXaxis()->SetTitle(titleX);
619 h->GetYaxis()->SetTitle(titleY);
620 h->GetZaxis()->SetTitle(titleZ);
630 Int_t nbinsX, Double_t* binsX,
632 Int_t nbinsY, Double_t* binsY,
634 Int_t nbinsZ, Double_t* binsZ,
638 TH3F* h =
new TH3F(name, title, nbinsX, binsX, nbinsY, binsY, nbinsZ, binsZ);
640 h->GetXaxis()->SetTitle(titleX);
641 h->GetYaxis()->SetTitle(titleY);
642 h->GetZaxis()->SetTitle(titleZ);
652 TH1* h, TList* histoList)
654 TH1F* h1 =
dynamic_cast<TH1F*
>(h);
655 TH2F* h2 =
dynamic_cast<TH2F*
>(h);
656 TH3F* h3 =
dynamic_cast<TH3F*
>(h);
661 newh =
new TH1F(*h1);
663 newh =
new TH2F(*h2);
665 newh =
new TH3F(*h3);
667 newh->SetName(newname);
668 newh->SetTitle(newtitle);
671 histoList->Add(newh);
682 histoList->Add(h_effMCTC_pt);
686 histoList->Add(h_effMCTC_theta);
690 histoList->Add(h_effMCTC_phi);
699 histoList->Add(h_ineffMCTC_pt);
701 TH1F* h_ineffMCTC_theta =
createHistogramsRatio(
"hineffMCTCtheta",
"1 - fraction of idealMCTrackCandVS #lambda",
703 histoList->Add(h_ineffMCTC_theta);
707 histoList->Add(h_ineffMCTC_phi);
712 TH1* hNum, TH1* hDen,
bool isEffPlot,
715 TH1F* h1den =
dynamic_cast<TH1F*
>(hDen);
716 TH1F* h1num =
dynamic_cast<TH1F*
>(hNum);
717 TH2F* h2den =
dynamic_cast<TH2F*
>(hDen);
718 TH2F* h2num =
dynamic_cast<TH2F*
>(hNum);
719 TH3F* h3den =
dynamic_cast<TH3F*
>(hDen);
720 TH3F* h3num =
dynamic_cast<TH3F*
>(hNum);
726 hden =
new TH1F(*h1den);
727 hnum =
new TH1F(*h1num);
730 hden =
new TH2F(*h2den);
731 hnum =
new TH2F(*h2num);
734 hden =
new TH3F(*h3den);
735 hnum =
new TH3F(*h3num);
743 the_axis = hden->GetXaxis();
744 the_other1 = hden->GetYaxis();
745 the_other2 = hden->GetZaxis();
746 }
else if (axisRef == 1) {
747 the_axis = hden->GetYaxis();
748 the_other1 = hden->GetXaxis();
749 the_other2 = hden->GetZaxis();
750 }
else if (axisRef == 2) {
751 the_axis = hden->GetZaxis();
752 the_other1 = hden->GetXaxis();
753 the_other2 = hden->GetYaxis();
759 if (the_axis->GetXbins()->GetSize())
760 h =
new TH1F(name, title, the_axis->GetNbins(), (the_axis->GetXbins())->GetArray());
762 h =
new TH1F(name, title, the_axis->GetNbins(), the_axis->GetXmin(), the_axis->GetXmax());
763 h->GetXaxis()->SetTitle(the_axis->GetTitle());
765 h->GetYaxis()->SetRangeUser(0.00001, 1);
770 for (
int the_bin = 1; the_bin < the_axis->GetNbins() + 1; the_bin++) {
775 for (
int other1_bin = 1; other1_bin < the_other1->GetNbins() + 1; other1_bin++)
776 for (
int other2_bin = 1; other2_bin < the_other2->GetNbins() + 1; other2_bin++) {
778 if (axisRef == 0) bin = hden->GetBin(the_bin, other1_bin, other2_bin);
779 else if (axisRef == 1) bin = hden->GetBin(other1_bin, the_bin, other2_bin);
780 else if (axisRef == 2) bin = hden->GetBin(other1_bin, other2_bin, the_bin);
782 if (hden->IsBinUnderflow(bin))
783 B2DEBUG(1,
" bin = " << bin <<
"(" << the_bin <<
"," << other1_bin <<
"," << other2_bin <<
"), UNDERFLOW");
784 if (hden->IsBinOverflow(bin))
785 B2DEBUG(1,
" bin = " << bin <<
"(" << the_bin <<
"," << other1_bin <<
"," << other2_bin <<
"), OVERFLOW");
787 num += hnum->GetBinContent(bin);
788 den += hden->GetBinContent(bin);
797 eff = (double)num / den;
798 err = sqrt(eff * (1 - eff)) / sqrt(den);
802 h->SetBinContent(the_bin, eff);
803 h->SetBinError(the_bin, err);
805 h->SetBinContent(the_bin, 1 - eff);
806 h->SetBinError(the_bin, err);
818 if (hitDistance < 1.8)
820 else if (hitDistance < 3)
822 else if (hitDistance < 5)
824 else if (hitDistance < 9)
826 else if (hitDistance < 12)
830 if ((hitDistance < 3) && (hitDistance > 1.2))
831 thetaMS = thetaMS / 2;
833 double dR =
m_nSigma * dL * thetaMS;
842 double thetaMS = 0.0136 * 14;
844 double p = mcParticleInfo.
getP();
854 thetaMS = thetaMS / (p * p / E) * sqrt(X / X0 * rho);
DataType Z() const
access variable Z (= .at(2) without boundary check)
@ c_ErrorIfAlreadyRegistered
If the object/array was already registered, produce an error (aborting initialisation).
This struct is used by the TrackingPerformanceEvaluation Module to save information of reconstructed ...
double getPt()
Getter for transverse momentum.
double getLambda()
Getter for Lambda.
double getEnergy()
Getter for energy.
double getOmega()
Getter for Omega.
double getPphi()
Getter for phi of momentum vector.
double getP()
Getter for magnitut of momentum.
A Class to store the Monte Carlo particle information.
float getEnergy() const
Return particle energy in GeV.
int getIndex() const
Get 1-based index of the particle in the corresponding MCParticle list.
TVector3 getMomentum() const
Return momentum.
float getCharge() const
Return the particle charge defined in TDatabasePDG.
int getPDG() const
Return PDG code of particle.
TVector3 getProductionVertex() const
Return production vertex position.
std::string m_rootFileName
root file name
bool m_applySemiplane
Wether to require that the hit is in the expected semiplane.
TH1F * m_h1_nBadTrueHits
Histogram.
bool m_applyWedge
Whether to require that the hit belong to the barrel part of the SVD.
TH3F * m_h3_MCTrackCand
Histogram.
void addInefficiencyPlots(TList *graphList=nullptr)
Function to create inefficiency plots and add them to list.
TH1F * m_h1_nBad1dInfo
Histogram.
int nWedge
Counter for hits on wedged sensors.
bool isInAnnulus(double hitDistance, double R, double dR)
Function to check if hitDistance is within a given annulus.
std::string m_mcParticlesName
MCParticle list name.
double semiPlane(TVector3 vertex, TVector3 center, TVector3 hit)
Function to get semiplane.
int nBarrel
Counter for hits on barrel sensors.
bool m_usePXD
Whether to use PXD.
void event() override
Event function.
TH1 * duplicateHistogram(const char *newname, const char *newtitle, TH1 *h, TList *histoList=nullptr)
Function to clone a histogram.
TH3F * m_h3_idealMCTrackCand
Histogram.
void endRun() override
End run.
float compute_thetaMS(MCParticleInfo &mcParticleInfo, VXDTrueHit *aTrueHit)
Calculate thetaMS.
void terminate() override
Termination action.
TH1F * m_h1_nGood1dInfo
Histogram.
bool m_applyLap
Whether to require that the hit belongs to the first lap in the transverse plane.
TH1F * m_h1_nGoodTrueHits
Histogram.
TH1F * m_h1_dRoverR
Histogram.
bool isFirstLap(double FirstHitTime, double HitTime, double LapTime)
Function to check if a hitTime is within a given lapTime, under consideration of m_fraction and with ...
void addEfficiencyPlots(TList *graphList=nullptr)
Function to create efficiency plots and add them to list.
TH1F * m_h1_timeDifference
Histogram.
void beginRun() override
Begin run.
TH1F * m_h1_hitDistance_rejected
Histogram.
TList * m_histoList
List of histograms.
TH1F * m_h1_hitRadius_rejected
Histogram.
TH1F * m_h1_lapTime
Histogram.
TH1F * m_h1_thetaMS_PXD
Histogram.
double m_fraction
Fraction of lap.
TH1F * m_h1_hitRadius_accepted
Histogram.
TH1F * m_h1_MCTrackCandNhits
Histogram.
TH3F * createHistogram3D(const char *name, const char *title, Int_t nbinsX, Double_t minX, Double_t maxX, const char *titleX, Int_t nbinsY, Double_t minY, Double_t maxY, const char *titleY, Int_t nbinsZ, Double_t minZ, Double_t maxZ, const char *titleZ, TList *histoList=nullptr)
Create a 3D ROOT Histogram.
TH1F * createHistogramsRatio(const char *name, const char *title, TH1 *hNum, TH1 *hDen, bool isEffPlot, int axisRef)
Function to create a ratio histogram from two histograms.
TH1F * m_h1_diffOVERlap
Histogram.
TH1F * m_h1_firstRejectedOVERMCHit
Histogram.
TH1F * m_h1_thetaMS_SVD
Histogram.
TH1F * m_h1_firstRejectedHit
Histogram.
TFile * m_rootFilePtr
Pointer to root file used for storing histograms.
TH1F * m_h1_hitDistance_accepted
Histogram.
bool m_applyAnnulus
Whether to require that the hit is in the expected annulus.
TH3F * m_h3_MCParticle
Histogram.
std::string m_mcTrackCandsColName
TrackCand list name.
bool isInSemiPlane(double semiPlane, double omega)
Function to check if a omega value is in a given semiPlane.
double theDistance(TVector3 center, TVector3 hit)
Get distance between two points.
float compute_dR(double thetaMS, double omega)
Calculate dR.
bool m_removeBadHits
Whether to remove the clusters that do not satisfy the criteria from the idealMCTrackCands.
int m_minHit
Minimum number of 1D Clusters to classify the MCTrackCand as ideal.
TH1F * m_h1_distOVERdR
Histogram.
The PXD Cluster class This class stores all information about reconstructed PXD clusters The position...
Class PXDTrueHit - Records of tracks that either enter or leave the sensitive volume.
Class for type safe access to objects that are referred to in relations.
size_t size() const
Get number of relations.
RelationVector< T > getRelationsWith(const std::string &name="", const std::string &namedRelation="") const
Get the relations between this object and another store array.
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
bool isUCluster() const
Get the direction of strips.
Class SVDTrueHit - Records of tracks that either enter or leave the sensitive volume.
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
T * appendNew()
Construct a new T object at the end of the array.
static const double T
[tesla]
Class VXDTrueHit - Records of tracks that either enter or leave the sensitive volume.
float getV() const
Return local v coordinate of hit.
float getGlobalTime() const
Return the time when the track reached its midpoint.
float getEntryU() const
Return local u coordinate of hit when entering silicon.
float getExitW() const
Return local w coordinate of hit at the endpoint of the track.
float getEntryW() const
Return local w coordinate of the start point of the track.
VxdID getSensorID() const
Return the Sensor ID.
float getU() const
Return local u coordinate of hit.
float getExitU() const
Return local u coordinate of hit at the endpoint of the track.
float getExitV() const
Return local v coordinate of hit at the endpoint of the track.
float getEntryV() const
Return local v coordinate of the start point of the track.
Class to faciliate easy access to sensor information of the VXD like coordinate transformations or pi...
const SensorInfoBase & getSensorInfo(Belle2::VxdID id) const
Return a referecne to the SensorInfo of a given SensorID.
static GeoCache & getInstance()
Return a reference to the singleton instance.
Base class to provide Sensor Information for PXD and SVD.
double getForwardWidth() const
Convinience Wrapper to return width at forward side.
double getBackwardWidth() const
Convinience Wrapper to return width at backward side.
TVector3 pointToGlobal(const TVector3 &local, bool reco=false) const
Convert a point from local to global coordinates.
Class to uniquely identify a any structure of the PXD and SVD.
Track candidate – seed values and indices.
void sortHits()
Sort the hits that were already added to the trackCand using the sorting parameters.
void reset()
Delete and clear the TrackCandHits.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
static void getField(const double *pos, double *field)
return the magnetic field at a given position.
Abstract base class for different kinds of events.