9#include <tracking/modules/mcTrackCandClassifier/MCTrackCandClassifierModule.h>
11#include <pxd/dataobjects/PXDTrueHit.h>
12#include <svd/dataobjects/SVDTrueHit.h>
13#include <vxd/geometry/GeoCache.h>
15#include <framework/geometry/B2Vector3.h>
16#include <framework/geometry/BFieldManager.h>
32 setDescription(
"This module is meant to classify the MCTrackCands as either ideal, fine and nasty");
36 "Name of MC Particle collection.",
40 "Name of the input collection of MC track candidates",
44 "Name of the root file",
45 std::string(
"MCTrackCandClassifier.root"));
48 "Require that the hit is in the expected annulus",
51 "Require that the hit is in the expected semiplane",
54 "Require that the hit belong to the first lap in the transverse plane",
57 "Require that the hit belong to the barrel part of the SVD",
60 "Remove the clusters that do not satisfy the criteria from the idealMCTrackCands",
64 "Minimum number of 1D Clusters to classify the MCTrackCand as ideal",
92 Double_t bins_pt[9 + 1] = {0, 0.05, 0.1, 0.15, 0.2, 0.3, 0.5, 1, 2, 3.5};
93 const 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()};
94 Double_t bins_lambda[10 + 1];
95 const Double_t width_lambda = TMath::Pi() / 10;
96 Double_t bins_phi[14 + 1];
97 const Double_t width_phi = 2 * TMath::Pi() / 14;
98 for (
int bin = 0; bin < 14 + 1; bin++)
99 bins_phi[bin] = - TMath::Pi() + bin * width_phi;
101 for (
int bin = 0; bin < 10 + 1; bin++) {
102 bins_lambda[bin] = - TMath::Pi() / 2 + bin * width_lambda;
103 B2DEBUG(21, bins_lambda[bin] <<
" " << bins_theta[bin]);
107 9, bins_pt,
"p_{t} (GeV/c)",
108 10, bins_lambda,
"#lambda",
109 14, bins_phi,
"#phi" );
112 "entry per idealMCTrackCand",
116 "entry per MCTrackCand",
120 m_h1_thetaMS_SVD =
new TH1F(
"h1thetaMS_SVD",
"Multiple Scattering Angle (SVD)", 500, 0, 500);
127 m_h1_dR =
new TH1F(
"h1dR",
"dR, annulus half width", 1000, 0, 5);
129 m_h1_dR->GetXaxis()->SetTitle(
"dR (cm)");
131 m_h1_dRoverR =
new TH1F(
"h1dRoverR",
"dR over helix radius", 1000, 0, 0.1);
135 m_h1_distOVERdR =
new TH1F(
"h1distOVERdR",
"(hit radius - helix radius)/dR", 100, -5, 5);
155 m_h1_lapTime =
new TH1F(
"h1LapTime",
"lap time", 200, 0, 100);
161 m_h1_diffOVERlap =
new TH1F(
"h1HitDiffOVERlap",
"Hit Time Difference over Lap Time",
166 m_h1_nGoodTrueHits =
new TH1F(
"h1nTrueHitsGoods",
"Number of True Hits for Accepted Tracks", 20, 0, 20);
170 m_h1_nBadTrueHits =
new TH1F(
"h1nTrueHitsBads",
"Number of True Hits for Rejected Tracks", 10, 0, 10);
174 m_h1_nGood1dInfo =
new TH1F(
"h1nGood1Dinfo",
"Number of 1D Info for Accepted Tracks", 20, 0, 20);
178 m_h1_nBad1dInfo =
new TH1F(
"h1nBad1Dinfo",
"Number of 1D Info for Rejected Tracks", 20, 0, 20);
207 B2DEBUG(21,
"+++++ 1. loop on MCTrackCands");
214 int nGoodTrueHits = 0;
217 B2DEBUG(21,
" a NEW MCTrackCand ");
222 B2DEBUG(21,
"~~~ " << MCParticles_fromMCTrackCand.
size() <<
" MCParticles related to this MCTrackCand");
223 for (
int mcp = 0; mcp < (int)MCParticles_fromMCTrackCand.
size(); mcp++) {
225 MCParticle mcParticle = *MCParticles_fromMCTrackCand[mcp];
227 B2DEBUG(21,
" a NEW charged MC Particle, " << mcParticle.
getIndex() <<
", " << mcParticle.
getPDG());
232 ROOT::Math::XYZVector mom = mcParticle.
getMomentum();
234 double omega = mcParticleInfo.
getOmega();
237 double pt = mom.Rho();
238 double x = decayVertex.
X();
239 double y = decayVertex.
Y();
240 double R = 1 / std::abs(omega);
244 double alpha =
R / pt * charge;
245 double Cx = x + alpha * py;
246 double Cy = y - alpha * px;
248 ROOT::Math::XYZVector center(Cx, Cy, 0);
251 int Nhits = mcTrackCand.getNHits();
255 bool hasTrueHit =
true;
256 bool isAccepted =
true;
257 int firstRejectedHit = Nhits + 1;
258 double prevHitRadius = std::abs(1 / omega);
261 double FirstHitTime = -1;
264 bool isFirstSVDhit =
true;
266 while (cluster < Nhits && isAccepted && hasTrueHit) {
268 mcTrackCand.getHit(cluster, detId, hitId);
270 bool hasPXDCluster =
false;
271 bool hasSVDuCluster =
false;
272 bool hasSVDvCluster =
false;
280 if (detId == Const::PXD &&
m_usePXD) {
284 if (PXDTrueHit_fromPXDCluster.
size() == 0) {
285 B2WARNING(
"What's happening?!? no True Hit associated to the PXD Cluster");
291 const PXDTrueHit* aPXDTrueHit = PXDTrueHit_fromPXDCluster[0];
295 uCoor = aPXDTrueHit->
getU();
296 vCoor = aPXDTrueHit->
getV();
300 HitTime = FirstHitTime;
304 hasPXDCluster =
true;
305 }
else if (detId == Const::SVD) {
308 if (SVDTrueHit_fromSVDCluster.
size() == 0) {
309 B2WARNING(
"What's happening?!? no True Hit associated to the SVD Cluster");
315 const SVDTrueHit* aSVDTrueHit = SVDTrueHit_fromSVDCluster[0];
320 uCoor = aSVDTrueHit->
getU();
321 vCoor = aSVDTrueHit->
getV();
325 HitTime = FirstHitTime;
326 isFirstSVDhit =
false;
331 hasSVDuCluster =
true;
333 hasSVDvCluster =
true;
340 bool accepted4 =
true;
349 ROOT::Math::XYZVector globalHit = aSensorInfo.
pointToGlobal(ROOT::Math::XYZVector(uCoor, vCoor, 0),
true);
352 bool accepted1 =
true;
357 B2DEBUG(21,
" semiplane: ACCEPTED");
359 B2DEBUG(21,
" semiplane: REJECTED, next track");
368 bool accepted2 =
true;
370 accepted2 =
isInAnnulus(hitRadius, prevHitRadius, dR);
372 prevHitRadius = hitRadius;
375 B2DEBUG(21,
" annulus: ACCEPTED");
377 B2DEBUG(21,
" annulus: REJECTED, next track");
380 bool accepted3 =
true;
382 accepted3 =
isFirstLap(FirstHitTime, HitTime, lapTime);
385 B2DEBUG(21,
" lapTime: ACCEPTED");
387 B2DEBUG(21,
" lapTime: REJECTED, next track");
390 if (accepted2 && accepted1 && accepted3 && accepted4) {
398 firstRejectedHit = cluster;
411 if (hasPXDCluster || hasSVDuCluster || hasSVDvCluster)
412 B2DEBUG(21,
"cluster: ACCEPTED (" << nGood1Dinfo <<
")");
418 B2DEBUG(21,
" idealMCTrackCand FOUND!! " << nGood1Dinfo <<
" 1D infos (" << nGoodTrueHits <<
" good true hits)");
423 genfit::TrackCand* tmpTrackCand =
new genfit::TrackCand(mcTrackCand);
425 if ((
int)firstRejectedHit <= (
int)mcTrackCand.getNHits()) {
426 tmpTrackCand->reset();
427 for (
int hit = 0; hit < firstRejectedHit; hit++)
428 if (mcTrackCand.getHit(hit))
429 tmpTrackCand->addHit(mcTrackCand.getHit(hit));
430 tmpTrackCand->sortHits();
437 B2DEBUG(21,
" too few good hits (" << nGood1Dinfo <<
") to track this one ( vs " << nGoodTrueHits <<
" true hits)");
450 B2INFO(
"** MCTrackCandClassifier parameters **");
452 B2INFO(
"use PXD information = " <<
m_usePXD);
453 B2INFO(
"--> classification criteria:");
455 B2INFO(
" -) |d - R| < " <<
m_nSigma <<
" dL thetaMS");
457 B2INFO(
" -) hit in the expected semiplane");
459 B2INFO(
" -) HitTime < " <<
m_fraction <<
" lap time");
461 B2INFO(
" -) hit must be in the barrel part of the VXD");
469 double efficiency = num / den ;
470 double efficiencyErr =
sqrt(efficiency * (1 - efficiency)) /
sqrt(den);
473 B2INFO(
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
474 B2INFO(
"~ MCTrackCandClassifier ~ SHORT SUMMARY ~");
476 B2INFO(
" + overall:");
477 B2INFO(
" fraction of ideal MCTrackCands = (" << efficiency * 100 <<
" +/- " << efficiencyErr * 100 <<
")% ");
479 B2INFO(
" # idealMCTrackCand = " << num);
480 B2INFO(
" # MCTrackCand = " << den);
481 B2INFO(
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
483 B2DEBUG(21,
" nWedge = " <<
nWedge);
484 B2DEBUG(21,
" nBarrel = " <<
nBarrel);
498 while ((obj = nextH()))
508 ROOT::Math::XYZVector err = center - vertex;
510 double semiPlane = err.Y() / err.X() * hit.X() + err.Y() / err.X() * vertex.x() - vertex.Y();
513 B2DEBUG(21,
" SEMI-PLANE defined by: y + " << err.Y() / err.X() <<
" x + " << err.Y() / err.X()*vertex.x() - vertex.Y() <<
" = 0");
514 B2DEBUG(21,
" with: center(" << center.X() <<
"," << center.Y() <<
")");
515 B2DEBUG(21,
" decayV(" << vertex.X() <<
"," << vertex.Y() <<
")");
516 B2DEBUG(21,
" vector(" << err.X() <<
"," << err.Y() <<
")");
517 B2DEBUG(21,
" y SLOPE = " <<
semiPlane <<
" VS y HIT = " << hit.Y());
518 B2DEBUG(21,
" HIT - SLOPE = " << -
semiPlane + hit.Y());
520 if (vertex.X() < center.X())
538 double xSquared = TMath::Power(center.X() - hit.X(), 2);
539 double ySquared = TMath::Power(center.Y() - hit.Y(), 2);
541 return TMath::Sqrt(xSquared + ySquared);
547 bool accepted =
false;
550 B2DEBUG(21,
" ANNULUS defined between radii: " <<
R - dR <<
" and " <<
R + dR);
551 B2DEBUG(21,
" hit distance = " << hitDistance);
552 B2DEBUG(21,
" helix radius = " <<
R);
553 B2DEBUG(21,
" dR = " << dR);
555 if ((hitDistance >
R - dR) && (hitDistance <
R + dR))
564 bool accepted =
false;
567 B2DEBUG(21,
" lapTime: " << LapTime);
568 B2DEBUG(21,
" FirstHitTime = " << FirstHitTime);
569 B2DEBUG(21,
" HitTime = " << HitTime);
570 B2DEBUG(21,
" difference = " << HitTime - FirstHitTime);
576 if (HitTime - FirstHitTime <
m_fraction * LapTime)
584 Int_t nbinsX, Double_t minX, Double_t maxX,
586 Int_t nbinsY, Double_t minY, Double_t maxY,
588 Int_t nbinsZ, Double_t minZ, Double_t maxZ,
592 TH3F* h =
new TH3F(name, title, nbinsX, minX, maxX, nbinsY, minY, maxY, nbinsZ, minZ, maxZ);
594 h->GetXaxis()->SetTitle(titleX);
595 h->GetYaxis()->SetTitle(titleY);
596 h->GetZaxis()->SetTitle(titleZ);
606 Int_t nbinsX, Double_t* binsX,
608 Int_t nbinsY, Double_t* binsY,
610 Int_t nbinsZ, Double_t* binsZ,
614 TH3F* h =
new TH3F(name, title, nbinsX, binsX, nbinsY, binsY, nbinsZ, binsZ);
616 h->GetXaxis()->SetTitle(titleX);
617 h->GetYaxis()->SetTitle(titleY);
618 h->GetZaxis()->SetTitle(titleZ);
628 TH1* h, TList* histoList)
630 TH1F* h1 =
dynamic_cast<TH1F*
>(h);
631 TH2F* h2 =
dynamic_cast<TH2F*
>(h);
632 TH3F* h3 =
dynamic_cast<TH3F*
>(h);
637 newh =
new TH1F(*h1);
639 newh =
new TH2F(*h2);
641 newh =
new TH3F(*h3);
643 if (newh ==
nullptr) {
644 B2ERROR(
"In function duplicateHistogram: newh is a nullptr. This shouldn't happen."\
645 "Don't continue creation of duplicate histogram in this case and return nullptr.");
649 newh->SetName(newname);
650 newh->SetTitle(newtitle);
653 histoList->Add(newh);
664 histoList->Add(h_effMCTC_pt);
668 histoList->Add(h_effMCTC_theta);
672 histoList->Add(h_effMCTC_phi);
681 histoList->Add(h_ineffMCTC_pt);
683 TH1F* h_ineffMCTC_theta =
createHistogramsRatio(
"hineffMCTCtheta",
"1 - fraction of idealMCTrackCandVS #lambda",
685 histoList->Add(h_ineffMCTC_theta);
689 histoList->Add(h_ineffMCTC_phi);
694 TH1* hNum, TH1* hDen,
bool isEffPlot,
697 TH1F* h1den =
dynamic_cast<TH1F*
>(hDen);
698 TH1F* h1num =
dynamic_cast<TH1F*
>(hNum);
699 TH2F* h2den =
dynamic_cast<TH2F*
>(hDen);
700 TH2F* h2num =
dynamic_cast<TH2F*
>(hNum);
701 TH3F* h3den =
dynamic_cast<TH3F*
>(hDen);
702 TH3F* h3num =
dynamic_cast<TH3F*
>(hNum);
708 hden =
new TH1F(*h1den);
709 hnum =
new TH1F(*h1num);
712 hden =
new TH2F(*h2den);
713 hnum =
new TH2F(*h2num);
716 hden =
new TH3F(*h3den);
717 hnum =
new TH3F(*h3num);
720 if (hden ==
nullptr or hnum ==
nullptr) {
721 B2ERROR(
"In function createHistogramsRatio: either hden or hnum are a nullptr. This shouldn't happen."\
722 "Don't continue creatio of histogram ratios in this case and return nullptr.");
731 the_axis = hden->GetXaxis();
732 the_other1 = hden->GetYaxis();
733 the_other2 = hden->GetZaxis();
734 }
else if (axisRef == 1) {
735 the_axis = hden->GetYaxis();
736 the_other1 = hden->GetXaxis();
737 the_other2 = hden->GetZaxis();
738 }
else if (axisRef == 2) {
739 the_axis = hden->GetZaxis();
740 the_other1 = hden->GetXaxis();
741 the_other2 = hden->GetYaxis();
747 if (the_axis->GetXbins()->GetSize())
748 h =
new TH1F(name, title, the_axis->GetNbins(), (the_axis->GetXbins())->GetArray());
750 h =
new TH1F(name, title, the_axis->GetNbins(), the_axis->GetXmin(), the_axis->GetXmax());
751 h->GetXaxis()->SetTitle(the_axis->GetTitle());
753 h->GetYaxis()->SetRangeUser(0.00001, 1);
757 for (
int the_bin = 1; the_bin < the_axis->GetNbins() + 1; the_bin++) {
762 for (
int other1_bin = 1; other1_bin < the_other1->GetNbins() + 1; other1_bin++)
763 for (
int other2_bin = 1; other2_bin < the_other2->GetNbins() + 1; other2_bin++) {
765 if (axisRef == 0) bin = hden->GetBin(the_bin, other1_bin, other2_bin);
766 else if (axisRef == 1) bin = hden->GetBin(other1_bin, the_bin, other2_bin);
767 else if (axisRef == 2) bin = hden->GetBin(other1_bin, other2_bin, the_bin);
769 if (hden->IsBinUnderflow(bin))
770 B2DEBUG(21,
" bin = " << bin <<
"(" << the_bin <<
"," << other1_bin <<
"," << other2_bin <<
"), UNDERFLOW");
771 if (hden->IsBinOverflow(bin))
772 B2DEBUG(21,
" bin = " << bin <<
"(" << the_bin <<
"," << other1_bin <<
"," << other2_bin <<
"), OVERFLOW");
774 num += hnum->GetBinContent(bin);
775 den += hden->GetBinContent(bin);
781 eff = (double)num / den;
782 err =
sqrt(eff * (1 - eff)) /
sqrt(den);
786 h->SetBinContent(the_bin, eff);
787 h->SetBinError(the_bin, err);
789 h->SetBinContent(the_bin, 1 - eff);
790 h->SetBinError(the_bin, err);
802 if (hitDistance < 1.8)
804 else if (hitDistance < 3)
806 else if (hitDistance < 5)
808 else if (hitDistance < 9)
810 else if (hitDistance < 12)
814 if ((hitDistance < 3) && (hitDistance > 1.2))
815 thetaMS = thetaMS / 2;
817 double dR =
m_nSigma * dL * thetaMS;
826 double thetaMS = 0.0136 * 14;
828 double p = mcParticleInfo.
getP();
838 thetaMS = thetaMS / (p * p /
E) *
sqrt(X / X0 * rho);
DataType X() const
access variable X (= .at(0) without boundary check)
DataType Y() const
access variable Y (= .at(1) without boundary check)
@ c_ErrorIfAlreadyRegistered
If the object/array was already registered, produce an error (aborting initialisation).
static RelationVector< T > getRelationsWithObj(const TObject *object, const std::string &name="", const std::string &namedRelation="")
Get the relations between an object and other objects in a store array.
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.
ROOT::Math::XYZVector getProductionVertex() const
Return production vertex position.
float getCharge() const
Return the particle charge defined in TDatabasePDG.
int getPDG() const
Return PDG code of particle.
ROOT::Math::XYZVector getMomentum() const
Return momentum.
std::string m_rootFileName
root file name
bool m_applySemiplane
Whether to require that the hit is in the expected semiplane.
TH1F * m_h1_nBadTrueHits
Histogram.
static float compute_thetaMS(MCParticleInfo &mcParticleInfo, const VXDTrueHit *aTrueHit)
Calculate thetaMS.
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.
ROOT::Math::XYZVector m_magField
magnetic field needed set particle info
TH1F * m_h1_nBad1dInfo
Histogram.
StoreArray< genfit::TrackCand > m_GenfitMCTrackCands
MC Genfit TrackCands StoreArray.
int nWedge
Counter for hits on wedged sensors.
StoreArray< SVDCluster > m_SVDClusters
SVDClusters StoreArray.
static bool isInAnnulus(double hitDistance, double R, double dR)
Function to check if hitDistance is within a given annulus.
void initialize() override
Initializes the Module.
std::string m_mcParticlesName
MCParticle list name.
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.
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.
MCTrackCandClassifierModule()
Constructor of the module.
StoreArray< genfit::TrackCand > m_GenfitIdealMCTrackCands
Ideal Genfit TrackCands StoreArray.
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.
StoreArray< PXDCluster > m_PXDClusters
PXDClusters StoreArray.
TH1F * m_h1_timeDifference
Histogram.
void beginRun() override
Begin run.
static double semiPlane(ROOT::Math::XYZVector vertex, ROOT::Math::XYZVector center, ROOT::Math::XYZVector hit)
Function to get semiplane.
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.
static double theDistance(ROOT::Math::XYZVector center, ROOT::Math::XYZVector hit)
Get distance between two points.
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.
StoreArray< MCParticle > m_MCParticles
MCParticles StoreArray.
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.
static bool isInSemiPlane(double semiPlane, double omega)
Function to check if a omega value is in a given semiPlane.
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.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
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.
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 facilitate easy access to sensor information of the VXD like coordinate transformations or p...
const SensorInfoBase & getSensorInfo(Belle2::VxdID id) const
Return a reference 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.
ROOT::Math::XYZVector pointToGlobal(const ROOT::Math::XYZVector &local, bool reco=false) const
Convert a point from local to global coordinates.
double getForwardWidth() const
Convenience Wrapper to return width at forward side.
double getBackwardWidth() const
Convenience Wrapper to return width at backward side.
Class to uniquely identify a any structure of the PXD and SVD.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
B2Vector3< double > B2Vector3D
typedef for common usage with double
static void getField(const double *pos, double *field)
return the magnetic field at a given position.
double sqrt(double a)
sqrt for double
Abstract base class for different kinds of events.