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);
126 m_h1_dR =
new TH1F(
"h1dR",
"dR, annulus half width", 1000, 0, 5);
128 m_h1_dR->GetXaxis()->SetTitle(
"dR (cm)");
130 m_h1_dRoverR =
new TH1F(
"h1dRoverR",
"dR over helix radius", 1000, 0, 0.1);
134 m_h1_distOVERdR =
new TH1F(
"h1distOVERdR",
"(hit radius - helix radius)/dR", 100, -5, 5);
154 m_h1_lapTime =
new TH1F(
"h1LapTime",
"lap time", 200, 0, 100);
160 m_h1_diffOVERlap =
new TH1F(
"h1HitDiffOVERlap",
"Hit Time Difference over Lap Time",
165 m_h1_nGoodTrueHits =
new TH1F(
"h1nTrueHitsGoods",
"Number of True Hits for Accepted Tracks", 20, 0, 20);
169 m_h1_nBadTrueHits =
new TH1F(
"h1nTrueHitsBads",
"Number of True Hits for Rejected Tracks", 10, 0, 10);
173 m_h1_nGood1dInfo =
new TH1F(
"h1nGood1Dinfo",
"Number of 1D Info for Accepted Tracks", 20, 0, 20);
177 m_h1_nBad1dInfo =
new TH1F(
"h1nBad1Dinfo",
"Number of 1D Info for Rejected Tracks", 20, 0, 20);
205 B2DEBUG(21,
"+++++ 1. loop on MCTrackCands");
212 int nGoodTrueHits = 0;
215 B2DEBUG(21,
" a NEW MCTrackCand ");
220 B2DEBUG(21,
"~~~ " << MCParticles_fromMCTrackCand.
size() <<
" MCParticles related to this MCTrackCand");
221 for (
int mcp = 0; mcp < (int)MCParticles_fromMCTrackCand.
size(); mcp++) {
223 MCParticle mcParticle = *MCParticles_fromMCTrackCand[mcp];
225 B2DEBUG(21,
" a NEW charged MC Particle, " << mcParticle.
getIndex() <<
", " << mcParticle.
getPDG());
230 ROOT::Math::XYZVector mom = mcParticle.
getMomentum();
232 double omega = mcParticleInfo.
getOmega();
235 double pt = mom.Rho();
236 double x = decayVertex.
X();
237 double y = decayVertex.
Y();
238 double R = 1 / std::abs(omega);
242 double alpha =
R / pt * charge;
243 double Cx = x + alpha * py;
244 double Cy = y - alpha * px;
246 ROOT::Math::XYZVector center(Cx, Cy, 0);
249 int Nhits = mcTrackCand.getNHits();
253 bool hasTrueHit =
true;
254 bool isAccepted =
true;
255 int firstRejectedHit = Nhits + 1;
256 double prevHitRadius = std::abs(1 / omega);
259 double FirstHitTime = -1;
262 bool isFirstSVDhit =
true;
264 while (cluster < Nhits && isAccepted && hasTrueHit) {
266 mcTrackCand.getHit(cluster, detId, hitId);
268 bool hasPXDCluster =
false;
269 bool hasSVDuCluster =
false;
270 bool hasSVDvCluster =
false;
278 if (detId == Const::PXD &&
m_usePXD) {
282 if (PXDTrueHit_fromPXDCluster.
size() == 0) {
283 B2WARNING(
"What's happening?!? no True Hit associated to the PXD Cluster");
289 PXDTrueHit* aPXDTrueHit = PXDTrueHit_fromPXDCluster[0];
293 uCoor = aPXDTrueHit->
getU();
294 vCoor = aPXDTrueHit->
getV();
298 HitTime = FirstHitTime;
302 hasPXDCluster =
true;
303 }
else if (detId == Const::SVD) {
306 if (SVDTrueHit_fromSVDCluster.
size() == 0) {
307 B2WARNING(
"What's happening?!? no True Hit associated to the SVD Cluster");
313 SVDTrueHit* aSVDTrueHit = SVDTrueHit_fromSVDCluster[0];
318 uCoor = aSVDTrueHit->
getU();
319 vCoor = aSVDTrueHit->
getV();
323 HitTime = FirstHitTime;
324 isFirstSVDhit =
false;
329 hasSVDuCluster =
true;
331 hasSVDvCluster =
true;
338 bool accepted4 =
true;
347 ROOT::Math::XYZVector globalHit = aSensorInfo.
pointToGlobal(ROOT::Math::XYZVector(uCoor, vCoor, 0),
true);
350 bool accepted1 =
true;
355 B2DEBUG(21,
" semiplane: ACCEPTED");
357 B2DEBUG(21,
" semiplane: REJECTED, next track");
366 bool accepted2 =
true;
368 accepted2 =
isInAnnulus(hitRadius, prevHitRadius, dR);
370 prevHitRadius = hitRadius;
373 B2DEBUG(21,
" annulus: ACCEPTED");
375 B2DEBUG(21,
" annulus: REJECTED, next track");
378 bool accepted3 =
true;
380 accepted3 =
isFirstLap(FirstHitTime, HitTime, lapTime);
383 B2DEBUG(21,
" lapTime: ACCEPTED");
385 B2DEBUG(21,
" lapTime: REJECTED, next track");
388 if (accepted2 && accepted1 && accepted3 && accepted4) {
396 firstRejectedHit = cluster;
409 if (hasPXDCluster || hasSVDuCluster || hasSVDvCluster)
410 B2DEBUG(21,
"cluster: ACCEPTED (" << nGood1Dinfo <<
")");
416 B2DEBUG(21,
" idealMCTrackCand FOUND!! " << nGood1Dinfo <<
" 1D infos (" << nGoodTrueHits <<
" good true hits)");
421 genfit::TrackCand* tmpTrackCand =
new genfit::TrackCand(mcTrackCand);
423 if ((
int)firstRejectedHit <= (
int)mcTrackCand.getNHits()) {
424 tmpTrackCand->reset();
425 for (
int hit = 0; hit < firstRejectedHit; hit++)
426 if (mcTrackCand.getHit(hit))
427 tmpTrackCand->addHit(mcTrackCand.getHit(hit));
428 tmpTrackCand->sortHits();
435 B2DEBUG(21,
" too few good hits (" << nGood1Dinfo <<
") to track this one ( vs " << nGoodTrueHits <<
" true hits)");
448 B2INFO(
"** MCTrackCandClassifier parameters **");
450 B2INFO(
"use PXD information = " <<
m_usePXD);
451 B2INFO(
"--> classification criteria:");
453 B2INFO(
" -) |d - R| < " <<
m_nSigma <<
" dL thetaMS");
455 B2INFO(
" -) hit in the expected semiplane");
457 B2INFO(
" -) HitTime < " <<
m_fraction <<
" lap time");
459 B2INFO(
" -) hit must be in the barrel part of the VXD");
467 double efficiency = num / den ;
468 double efficiencyErr =
sqrt(efficiency * (1 - efficiency)) /
sqrt(den);
471 B2INFO(
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
472 B2INFO(
"~ MCTrackCandClassifier ~ SHORT SUMMARY ~");
474 B2INFO(
" + overall:");
475 B2INFO(
" fraction of ideal MCTrackCands = (" << efficiency * 100 <<
" +/- " << efficiencyErr * 100 <<
")% ");
477 B2INFO(
" # idealMCTrackCand = " << num);
478 B2INFO(
" # MCTrackCand = " << den);
479 B2INFO(
"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
481 B2DEBUG(21,
" nWedge = " <<
nWedge);
482 B2DEBUG(21,
" nBarrel = " <<
nBarrel);
496 while ((obj = nextH()))
506 ROOT::Math::XYZVector err = center - vertex;
508 double semiPlane = err.Y() / err.X() * hit.X() + err.Y() / err.X() * vertex.x() - vertex.Y();
511 B2DEBUG(21,
" SEMI-PLANE defined by: y + " << err.Y() / err.X() <<
" x + " << err.Y() / err.X()*vertex.x() - vertex.Y() <<
" = 0");
512 B2DEBUG(21,
" with: center(" << center.X() <<
"," << center.Y() <<
")");
513 B2DEBUG(21,
" decayV(" << vertex.X() <<
"," << vertex.Y() <<
")");
514 B2DEBUG(21,
" vector(" << err.X() <<
"," << err.Y() <<
")");
515 B2DEBUG(21,
" y SLOPE = " <<
semiPlane <<
" VS y HIT = " << hit.Y());
516 B2DEBUG(21,
" HIT - SLOPE = " << -
semiPlane + hit.Y());
518 if (vertex.X() < center.X())
536 double xSquared = TMath::Power(center.X() - hit.X(), 2);
537 double ySquared = TMath::Power(center.Y() - hit.Y(), 2);
539 return TMath::Sqrt(xSquared + ySquared);
545 bool accepted =
false;
548 B2DEBUG(21,
" ANNULUS defined between radii: " <<
R - dR <<
" and " <<
R + dR);
549 B2DEBUG(21,
" hit distance = " << hitDistance);
550 B2DEBUG(21,
" helix radius = " <<
R);
551 B2DEBUG(21,
" dR = " << dR);
553 if ((hitDistance >
R - dR) && (hitDistance <
R + dR))
562 bool accepted =
false;
565 B2DEBUG(21,
" lapTime: " << LapTime);
566 B2DEBUG(21,
" FirstHitTime = " << FirstHitTime);
567 B2DEBUG(21,
" HitTime = " << HitTime);
568 B2DEBUG(21,
" difference = " << HitTime - FirstHitTime);
574 if (HitTime - FirstHitTime <
m_fraction * LapTime)
582 Int_t nbinsX, Double_t minX, Double_t maxX,
584 Int_t nbinsY, Double_t minY, Double_t maxY,
586 Int_t nbinsZ, Double_t minZ, Double_t maxZ,
590 TH3F* h =
new TH3F(name, title, nbinsX, minX, maxX, nbinsY, minY, maxY, nbinsZ, minZ, maxZ);
592 h->GetXaxis()->SetTitle(titleX);
593 h->GetYaxis()->SetTitle(titleY);
594 h->GetZaxis()->SetTitle(titleZ);
604 Int_t nbinsX, Double_t* binsX,
606 Int_t nbinsY, Double_t* binsY,
608 Int_t nbinsZ, Double_t* binsZ,
612 TH3F* h =
new TH3F(name, title, nbinsX, binsX, nbinsY, binsY, nbinsZ, binsZ);
614 h->GetXaxis()->SetTitle(titleX);
615 h->GetYaxis()->SetTitle(titleY);
616 h->GetZaxis()->SetTitle(titleZ);
626 TH1* h, TList* histoList)
628 TH1F* h1 =
dynamic_cast<TH1F*
>(h);
629 TH2F* h2 =
dynamic_cast<TH2F*
>(h);
630 TH3F* h3 =
dynamic_cast<TH3F*
>(h);
635 newh =
new TH1F(*h1);
637 newh =
new TH2F(*h2);
639 newh =
new TH3F(*h3);
641 if (newh ==
nullptr) {
642 B2ERROR(
"In function duplicateHistogram: newh is a nullptr. This shouldn't happen."\
643 "Don't continue creation of duplicate histogram in this case and return nullptr.");
647 newh->SetName(newname);
648 newh->SetTitle(newtitle);
651 histoList->Add(newh);
662 histoList->Add(h_effMCTC_pt);
666 histoList->Add(h_effMCTC_theta);
670 histoList->Add(h_effMCTC_phi);
679 histoList->Add(h_ineffMCTC_pt);
681 TH1F* h_ineffMCTC_theta =
createHistogramsRatio(
"hineffMCTCtheta",
"1 - fraction of idealMCTrackCandVS #lambda",
683 histoList->Add(h_ineffMCTC_theta);
687 histoList->Add(h_ineffMCTC_phi);
692 TH1* hNum, TH1* hDen,
bool isEffPlot,
695 TH1F* h1den =
dynamic_cast<TH1F*
>(hDen);
696 TH1F* h1num =
dynamic_cast<TH1F*
>(hNum);
697 TH2F* h2den =
dynamic_cast<TH2F*
>(hDen);
698 TH2F* h2num =
dynamic_cast<TH2F*
>(hNum);
699 TH3F* h3den =
dynamic_cast<TH3F*
>(hDen);
700 TH3F* h3num =
dynamic_cast<TH3F*
>(hNum);
706 hden =
new TH1F(*h1den);
707 hnum =
new TH1F(*h1num);
710 hden =
new TH2F(*h2den);
711 hnum =
new TH2F(*h2num);
714 hden =
new TH3F(*h3den);
715 hnum =
new TH3F(*h3num);
718 if (hden ==
nullptr or hnum ==
nullptr) {
719 B2ERROR(
"In function createHistogramsRatio: either hden or hnum are a nullptr. This shouldn't happen."\
720 "Don't continue creatio of histogram ratios in this case and return nullptr.");
729 the_axis = hden->GetXaxis();
730 the_other1 = hden->GetYaxis();
731 the_other2 = hden->GetZaxis();
732 }
else if (axisRef == 1) {
733 the_axis = hden->GetYaxis();
734 the_other1 = hden->GetXaxis();
735 the_other2 = hden->GetZaxis();
736 }
else if (axisRef == 2) {
737 the_axis = hden->GetZaxis();
738 the_other1 = hden->GetXaxis();
739 the_other2 = hden->GetYaxis();
745 if (the_axis->GetXbins()->GetSize())
746 h =
new TH1F(name, title, the_axis->GetNbins(), (the_axis->GetXbins())->GetArray());
748 h =
new TH1F(name, title, the_axis->GetNbins(), the_axis->GetXmin(), the_axis->GetXmax());
749 h->GetXaxis()->SetTitle(the_axis->GetTitle());
751 h->GetYaxis()->SetRangeUser(0.00001, 1);
755 for (
int the_bin = 1; the_bin < the_axis->GetNbins() + 1; the_bin++) {
760 for (
int other1_bin = 1; other1_bin < the_other1->GetNbins() + 1; other1_bin++)
761 for (
int other2_bin = 1; other2_bin < the_other2->GetNbins() + 1; other2_bin++) {
763 if (axisRef == 0) bin = hden->GetBin(the_bin, other1_bin, other2_bin);
764 else if (axisRef == 1) bin = hden->GetBin(other1_bin, the_bin, other2_bin);
765 else if (axisRef == 2) bin = hden->GetBin(other1_bin, other2_bin, the_bin);
767 if (hden->IsBinUnderflow(bin))
768 B2DEBUG(21,
" bin = " << bin <<
"(" << the_bin <<
"," << other1_bin <<
"," << other2_bin <<
"), UNDERFLOW");
769 if (hden->IsBinOverflow(bin))
770 B2DEBUG(21,
" bin = " << bin <<
"(" << the_bin <<
"," << other1_bin <<
"," << other2_bin <<
"), OVERFLOW");
772 num += hnum->GetBinContent(bin);
773 den += hden->GetBinContent(bin);
779 eff = (double)num / den;
780 err =
sqrt(eff * (1 - eff)) /
sqrt(den);
784 h->SetBinContent(the_bin, eff);
785 h->SetBinError(the_bin, err);
787 h->SetBinContent(the_bin, 1 - eff);
788 h->SetBinError(the_bin, err);
800 if (hitDistance < 1.8)
802 else if (hitDistance < 3)
804 else if (hitDistance < 5)
806 else if (hitDistance < 9)
808 else if (hitDistance < 12)
812 if ((hitDistance < 3) && (hitDistance > 1.2))
813 thetaMS = thetaMS / 2;
815 double dR =
m_nSigma * dL * thetaMS;
824 double thetaMS = 0.0136 * 14;
826 double p = mcParticleInfo.
getP();
836 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.
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.
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.
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.
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.
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.
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.
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.