10#include <klm/modules/KLMTracking/KLMTrackingModule.h>
13#include <klm/bklm/geometry/GeometryPar.h>
14#include <klm/modules/KLMTracking/KLMTrackFinder.h>
15#include <klm/eklm/geometry/TransformDataGlobalAligned.h>
18#include <framework/dataobjects/EventMetaData.h>
19#include <framework/datastore/StoreObjPtr.h>
20#include <framework/datastore/StoreArray.h>
21#include <framework/logging/Logger.h>
22#include <tracking/dataobjects/RecoHitInformation.h>
29using namespace Belle2::KLM;
42 m_runTotalEventsWithTracks(0)
44 for (
int i = 0; i < 8; ++i) {
52 setDescription(
"Perform standard-alone straight line tracking for KLM. ");
55 "[degree], match KLMTrack to RecoTrack; angle between them is required to be smaller than (default 10)",
double(10.0));
57 "[cm], During efficiency calculation, distance between track and 2dhit must be smaller than (default 10)",
double(10.0));
59 "[sigma], During efficiency calculation, uncertainty of 2dhit must be smaller than (default 5); ",
double(5));
61 ", During track finding, a good track after initial seed hits must be larger than is (default 2); ",
unsigned(2));
63 ", During track finding, a good track after initial seed hits must be smaller than is (default 60); ",
unsigned(60));
65 ", Only look at tracks with more than n number of layers; ",
int(4));
66 addParam(
"StudyEffiMode",
m_studyEffi,
"[bool], run in efficieny study mode (default is false)",
false);
67 addParam(
"outputName",
m_outPath,
"[string], output file name containing efficiencies plots ",
68 std::string(
"standaloneKLMEffi.root"));
87 B2INFO(
"KLMTrackingModule::initialize this module is running in efficiency study mode!");
91 std::string labelFB[2] = {
"BB",
"BF"};
98 m_totalYX =
new TH2F(
"totalYX",
" denominator Y vs. X", gNbin, gmin, gmax, gNbin, gmin, gmax);
99 m_passYX =
new TH2F(
"passYX",
" numerator Y vs. X", gNbin, gmin, gmax, gNbin, gmin, gmax);
100 m_totalYZ =
new TH2F(
"totalYZ",
" denominator Y vs. Z", gNbin, gmin, gmax, gNbin, gmin, gmax);
101 m_passYZ =
new TH2F(
"passYZ",
" numerator Y vs. Z", gNbin, gmin, gmax, gNbin, gmin, gmax);
102 m_effiYX =
new TH2F(
"effiYX",
" effi. Y vs. X", gNbin, gmin, gmax, gNbin, gmin, gmax);
103 m_effiYZ =
new TH2F(
"effiYZ",
" effi. Y vs. X", gNbin, gmin, gmax, gNbin, gmin, gmax);
104 m_effiYX->GetXaxis()->SetTitle(
"x (cm)");
105 m_effiYX->GetYaxis()->SetTitle(
"y (cm)");
106 m_effiYZ->GetXaxis()->SetTitle(
"z (cm)");
107 m_effiYZ->GetYaxis()->SetTitle(
"y (cm)");
108 for (
int iF = 0; iF < 2; iF++) {
109 for (
int iS = 0; iS < 8; iS++) {
110 hname.Form(
"effi_%s%i", labelFB[iF].c_str(), iS);
111 m_effiVsLayer[iF][iS] =
new TEfficiency(hname, hname, Nbin, 0, 16);
112 hname.Form(
"total_%s%i", labelFB[iF].c_str(), iS);
113 m_total[iF][iS] =
new TH1F(hname, hname, Nbin, 0, 16);
114 hname.Form(
"pass_%s%i", labelFB[iF].c_str(), iS);
115 m_pass[iF][iS] =
new TH1F(hname, hname, Nbin, 0, 16);
148 m_runNumber.push_back((
int)eventMetaData->getRun());
156 bool thereIsATrack =
false;
162 thereIsATrack =
true;
164 for (
int iSection = 0; iSection < 2; iSection++) {
165 for (
int iSector = 0; iSector < 8; iSector++) {
166 for (
int iLayer = 0; iLayer < 15; iLayer++) {
169 thereIsATrack =
true;
191 if (
hits2D.getEntries() < 1)
194 for (
int j = 0; j <
hits2D.getEntries(); j++) {
195 if (
hits2D[j]->getSubdetector() != iSubdetector)
197 hits2D[j]->isOnStaTrack(
false);
201 for (
int hi = 0; hi <
hits2D.getEntries() - 1; ++hi) {
202 if (
hits2D[hi]->getSubdetector() != iSubdetector)
209 if (
hits2D[hi]->isOnStaTrack())
211 if (
hits2D[hi]->isOutOfTime())
213 for (
int hj = hi + 1; hj <
hits2D.getEntries(); ++hj) {
215 if (
hits2D[hj]->isOnStaTrack())
217 if (
hits2D[hj]->isOutOfTime())
220 if (
hits2D[hi]->getSubdetector() !=
hits2D[hj]->getSubdetector())
223 std::abs(
hits2D[hi]->getLayer() -
hits2D[hj]->getLayer()) < 3)
226 std::list<KLMHit2d*> sectorHitList;
229 std::list<KLMHit2d*> seed;
230 seed.push_back(
hits2D[hi]);
231 seed.push_back(
hits2D[hj]);
233 for (
int ho = 0; ho <
hits2D.getEntries(); ++ho) {
236 if (ho == hi || ho == hj)
238 if (mode == 1 && (
hits2D[ho]->getSubdetector() != iSubdetector))
244 if (
hits2D[ho]->isOnStaTrack())
249 if (
hits2D[ho]->isOutOfTime())
251 sectorHitList.push_back(
hits2D[ho]);
261 std::list<KLMHit2d*> m_hits;
263 if (m_finder->
filter(seed, sectorHitList, m_hits, iSubdetector)) {
271 std::list<KLMHit2d*>::iterator j;
273 int nBKLM = 0;
int nEKLM = 0;
274 for (j = m_hits.begin(); j != m_hits.end(); ++j) {
275 (*j)->isOnStaTrack(
true);
282 B2DEBUG(31,
"KLMTracking::runTracking totalHit " << m_hits.size() <<
", nBKLM " << nBKLM <<
", nEKLM " << nEKLM);
288 B2DEBUG(30,
"KLMTracking::runTracking started RecoTrack matching");
291 B2DEBUG(30,
"KLMTracking::runTracking was able to find ClosestRecoTrack");
293 for (j = m_hits.begin(); j != m_hits.end(); ++j) {
296 closestTrack->
addBKLMHit((*j), sortingParameter, RecoHitInformation::OriginTrackFinder::c_LocalTrackFinder);
299 closestTrack->
addEKLMHit(&(alignmentHit), sortingParameter,
300 RecoHitInformation::OriginTrackFinder::c_LocalTrackFinder);
324 for (
long unsigned int i = 0; i <
m_runNumber.size(); i++) {
326 B2INFO(
"KLMTrackingModule::terminate run " <<
m_runNumber.at(i) <<
" --> " << ratio * 100 <<
"% of events has 1+ KLMTracks");
330 for (
int iF = 0; iF < 2; iF++) {
331 for (
int iS = 0; iS < 8; iS++) {
338 for (
int i = 0; i <
m_totalYX->GetNbinsX(); i++) {
339 for (
int j = 0; j <
m_totalYX->GetNbinsY(); j++) {
340 float num =
m_passYX->GetBinContent(i + 1, j + 1);
341 float denom =
m_totalYX->GetBinContent(i + 1, j + 1);
343 m_effiYX->SetBinContent(i + 1, j + 1, num / denom);
344 m_effiYX->SetBinError(i + 1, j + 1,
sqrt(num * (denom - num) / (denom * denom * denom)));
346 m_effiYX->SetBinContent(i + 1, j + 1, 0);
347 m_effiYX->SetBinError(i + 1, j + 1, 0);
350 num =
m_passYZ->GetBinContent(i + 1, j + 1);
351 denom =
m_totalYZ->GetBinContent(i + 1, j + 1);
353 m_effiYZ->SetBinContent(i + 1, j + 1, num / denom);
354 m_effiYZ->SetBinError(i + 1, j + 1,
sqrt(num * (denom - num) / (denom * denom * denom)));
356 m_effiYZ->SetBinContent(i + 1, j + 1, 0);
357 m_effiYZ->SetBinError(i + 1, j + 1, 0);
394 if (klmHits.
size() < 1) {
395 B2INFO(
"KLMTrackingModule::findClosestRecoTrack, something is wrong! there is a KLMTrack but no klmHits");
399 B2DEBUG(20,
"KLMTrackingModule::findClosestRecoTrack, there is no recoTrack");
402 double oldDistanceSq = INFINITY;
403 double oldAngle = INFINITY;
404 closestTrack =
nullptr;
409 TVector3 firstKLMHitPosition(klmHits[0]->
getPosition().X(),
427 if (track.wasFitSuccessful()) {
429 genfit::MeasuredStateOnPlane state = track.getMeasuredStateOnPlaneFromLastHit();
430 B2DEBUG(30,
"KLMTracking::findClosestRecoTrack, finished MSOP from last hit");
432 state.getPosMomCov(pos, mom, cov);
433 if (mom.Y() * pos.Y() < 0) {
434 state = track.getMeasuredStateOnPlaneFromFirstHit();
436 const TVector3& distanceVec = firstKLMHitPosition - pos;
437 state.extrapolateToPoint(firstKLMHitPosition);
438 double newDistanceSq = distanceVec.Mag2();
439 double angle = klmTrkVec.Angle(mom);
442 if (newDistanceSq < oldDistanceSq) {
443 oldDistanceSq = newDistanceSq;
444 closestTrack = &track;
454 B2DEBUG(30,
"KLMTracking::findClosestRecoTrack, step one done");
455 }
catch (genfit::Exception& e) {
467 B2DEBUG(28,
"KLMTrackingModule::findClosestRecoTrack RecoTrack found! ");
478 std::set<int> m_pointUsed;
479 std::set<int> layerList;
483 B2DEBUG(10,
"KLMTrackingModule:generateEffi: " << iSection <<
" " << iSector <<
" " << iLayer);
495 for (
const KLMHit2d& hit2D : relatedHit2D) {
496 if (hit2D.getSubdetector() != iSubdetector)
498 if (hit2D.getLayer() > iLayer + 1)
499 {cnt1++; layerList.insert(hit2D.getLayer());}
500 if (hit2D.getLayer() < iLayer + 1)
501 {cnt2++; layerList.insert(hit2D.getLayer());}
502 if (hit2D.getLayer() == iLayer + 1) {
503 B2DEBUG(10,
"generateEffi: Hit info. Secti/sector/Lay = " << hit2D.getSection()
504 <<
"/" << hit2D.getSector() - 1 <<
"/" << hit2D.getLayer() - 1);
505 B2DEBUG(11,
"generateEffi: Hit info. x/y/z = " << hit2D.getPositionX()
506 <<
"/" << hit2D.getPositionY() <<
"/" << hit2D.getPositionZ());
513 if (iLayer != 0 && cnt2 < 1)
515 if (iLayer != 14 && cnt1 < 1)
525 int minPhiStrip = module->getPhiStripMin();
526 int maxPhiStrip = module->getPhiStripMax();
527 int minZStrip = module->getZStripMin();
528 int maxZStrip = module->getZStripMax();
530 CLHEP::Hep3Vector local = module->getLocalPosition(minPhiStrip, minZStrip);
531 CLHEP::Hep3Vector local2 = module->getLocalPosition(maxPhiStrip, maxZStrip);
532 float minLocalY, maxLocalY;
533 float minLocalZ, maxLocalZ;
534 if (local[1] > local2[1]) {
535 maxLocalY = local[1];
536 minLocalY = local2[1];
538 maxLocalY = local2[1];
539 minLocalY = local[1];
541 if (local[2] > local2[2]) {
542 maxLocalZ = local[2];
543 minLocalZ = local2[2];
545 maxLocalZ = local2[2];
546 minLocalZ = local[2];
553 Hep3Vector point1(0, trkPar[0], trkPar[2]);
554 Hep3Vector point2(1, trkPar[0] + trkPar[1], trkPar[2] + trkPar[3]);
556 Hep3Vector refPoint1(0., 0., 0.); Hep3Vector refPoint2(0., 0., 0.);
560 Hep3Vector refSlope(refPoint2[0] - refPoint1[0], refPoint2[1] - refPoint1[1], refPoint2[2] - refPoint1[2]);
568 reflocalX = -reflocalX;
569 float X_coord = (reflocalX - refPoint1[0]) / refSlope[0];
570 float reflocalY = refPoint1[1] + refSlope[1] * X_coord;
571 float reflocalZ = refPoint1[2] + refSlope[2] * X_coord;
574 Hep3Vector reflocal(reflocalX, reflocalY, reflocalZ);
575 Hep3Vector global(0., 0., 0.);
579 float localX = module->globalToLocal(global)[0];
580 float localY = module->globalToLocal(global)[1];
581 float localZ = module->globalToLocal(global)[2];
583 B2DEBUG(10,
"KLMTrackingModule:generateEffi: RefLocal " << reflocalX <<
" " << reflocalY <<
" " << reflocalZ);
584 B2DEBUG(10,
"KLMTrackingModule:generateEffi: Global " << global[0] <<
" " << global[1] <<
" " << global[2]);
585 B2DEBUG(10,
"KLMTrackingModule:generateEffi: Local " << localX <<
" " << localY <<
" " << localZ);
590 if (localY > minLocalY && localY < maxLocalY && localZ > minLocalZ && localZ < maxLocalZ) {
592 bool m_iffound =
false;
593 m_total[iSection][iSector]->Fill(iLayer + 1);
597 for (
int he = 0; he <
hits2D.getEntries(); ++he) {
599 B2DEBUG(11,
"not isLayerUnderStudy");
602 if (
hits2D[he]->isOutOfTime()) {
603 B2DEBUG(11,
"hit isOutOfTime");
607 if (m_pointUsed.find(he) != m_pointUsed.end()) {
608 B2DEBUG(11,
"passed unused");
611 B2DEBUG(11,
"KLMTrackingModule:generateEffi: Reached Distance Check");
614 float hitX =
hits2D[he]->getPositionX();
615 float hitY =
hits2D[he]->getPositionY();
616 float hitZ =
hits2D[he]->getPositionZ();
617 float deltaX = hitX - global[0];
float deltaY = hitY - global[1];
float deltaZ = hitZ - global[2];
618 float dist =
sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ);
619 B2DEBUG(10,
"dist w/ hit = " << dist <<
", dist func = " << distance <<
", error = " << error);
622 B2DEBUG(10,
"KLMTrackingModule:generateEffi: Hit found!");
625 m_pointUsed.insert(he);
626 m_pass[iSection][iSector]->Fill(iLayer + 1);
627 m_passYX->Fill(global[0], global[1]);
628 m_passYZ->Fill(global[2], global[1]);
633 m_effiVsLayer[iSection][iSector]->Fill(m_iffound, iLayer + 1);
653 if (hit->getSection() == section && hit->getSector() == iSector + 1 && hit->getLayer() == iLayer + 1)
660 if (hit->getSection() == section && hit->getSector() == iSector + 1)
670 double x, y, z, dx, dy, dz, distance;
675 TVectorD m_GlobalPar = track->getTrackParam();
688 z = hit->getPositionZ();
689 x = (z - m_GlobalPar[ 2 ]) / m_GlobalPar[ 3 ];
690 y = m_GlobalPar[ 0 ] + x * m_GlobalPar[ 1 ];
692 dx = x - hit->getPositionX() ;
693 dy = y - hit->getPositionY();
694 dz = z - hit->getPositionZ();
696 double x2 = hit->getPositionX();
697 double y2 = m_GlobalPar[ 0 ] + x2 * m_GlobalPar[ 1 ];
698 double z2 = m_GlobalPar[ 2 ] + x2 * m_GlobalPar[ 3 ];
700 double dx2 = x2 - hit->getPositionX();
701 double dy2 = y2 - hit->getPositionY();
702 double dz2 = z2 - hit->getPositionZ();
704 double dist2 =
sqrt(dx2 * dx2 + dy2 * dy2 + dz2 * dz2);
707 distance =
sqrt(dx * dx + dy * dy + dz * dz);
712 error =
sqrt(pow(hit_localPhiErr, 2) +
713 pow(hit_localZErr, 2));
714 B2DEBUG(11,
"Dist = " << distance <<
", error = " << error);
715 B2DEBUG(11,
"Dist2 = " << dist2 <<
", error = " << error);
725 z = hit->getPositionZ();
726 x = (z - m_GlobalPar[ 2 ]) / m_GlobalPar[ 3 ];
727 y = m_GlobalPar[ 0 ] + x * m_GlobalPar[ 1 ];
729 dx = x - hit->getPositionX();
730 dy = y - hit->getPositionY();
733 distance =
sqrt(dx * dx + dy * dy + dz * dz);
738 (hit->getXStripMax() - hit->getXStripMin()) /
sqrt(12);
740 (hit->getYStripMax() - hit->getYStripMin()) /
sqrt(12);
744 error =
sqrt(pow(hit_xErr, 2) +
748 B2WARNING(
"KLMTracking::distanceToHit Received KLMHit2d that's not from E/B-KLM. Setting distance to -1");
754 sigma = distance / error;
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
This dataobject is used only for EKLM alignment.
double getWidth() const
Get width.
const StripGeometry * getStripGeometry() const
Get strip geometry data.
int getLayer() const
Get layer number.
int getSection() const
Get section number.
int getSector() const
Get sector number.
bool filter(const std::list< KLMHit2d * > &seed, std::list< KLMHit2d * > &hits, std::list< KLMHit2d * > &track, int iSubdetector)
find associated hits and do fit.
void registerFitter(KLMTrackFitter *fitter)
Register a fitter if not constructed with one.
float getChi2()
Chi square of the fit.
bool isGood()
Is fit good.
int getNumHit()
number of the hits on this track
CLHEP::HepSymMatrix getTrackParamErr()
Get invariance matrix of track parameters in the global system.
CLHEP::HepVector getTrackParam()
Get track parameters in the global system. y = p0 + p1 * x; z = p2 + p3 * x.
bool isValid()
Is fit valid.
Store one KLM Track as a ROOT object.
void setIsValid(const bool valid)
set the fit valid status
void setTrackChi2(const float chi2)
Set the fitted chi2 of the track.
void setTrackParamErr(const CLHEP::HepSymMatrix &trkParErr)
Set invariance matrix of track parameters in the global system.
void setNumHitOnTrack(const int NumHit)
Set the number of 2d hits on the track.
TVectorD getTrackParam()
Get track parameters in the global system. y = p0 + p1 * x; z = p2 + p3 * x.
void setIsGood(const bool good)
set the fit good status
void setInSubdetector(int nBKLM, int nEKLM)
setting whether track passes through E/B-KLM
void setTrackParam(const CLHEP::HepVector &trkPar)
Set track parameters in the global system. y = p0 + p1 * x; z = p2 + p3 * x.
void generateEffi(int iSubdetector, int section, int sector, int layer)
calculate efficiency
bool m_MatchToRecoTrack
whether match KLMTrack to RecoTrack
TEfficiency * m_effiVsLayer[2][8]
Efficieny of each layer.
std::vector< int > m_runNumber
run number
TH2F * m_passYZ
passed event at global position Y vs Z
TH2F * m_effiYX
Efficieny at global position Y vs X.
bool m_studyEffi
option for efficieny study mode, in this mode, the layer under study should not be used in tracking
double m_maxSigma
maximum sigma for hit acceptance during efficiency calculation
void runTracking(int mode, int iSubdetector, int section, int sector, int layer)
run the track finding and fitting
double m_maxAngleRequired
angle required between RecoTrack and KLMTrack, if openangle is larger than m_maxAngleRequired,...
int m_minNLayer
minimum number of layers for track finder to run
void initialize() override
Initialize at start of job.
unsigned int m_minHitList
minimum number of hits in sector for track finder to run (-2 from initial seed)
std::string m_outPath
output file name containing efficiencies plots
void event() override
Unpack one event and create digits.
Belle2::KLM::KLMGeometryPar * m_GeoPar
KLMGeometryPar to call on B/E-KLM.
bool findClosestRecoTrack(KLMTrack *klmTrk, RecoTrack *&closestTrack)
find the closest RecoTrack, match KLMTrack to RecoTrack, if the matched RecoTrack is found,...
void endRun() override
end run stuff
StoreArray< RecoTrack > recoTracks
RecoTrack StoreArray.
void terminate() override
Terminate at the end of job.
TH1F * m_pass[2][8]
Numerator of each layer.
TH2F * m_totalYX
total event at global position Y vs X
StoreArray< RecoHitInformation > recoHitInformation
RecoHitInformation StoreArray.
int m_runTotalEventsWithTracks
total number of processed events in the run with at lease one BKLMTrack
void beginRun() override
begin run stuff
KLMTrackingModule()
Constructor.
double m_maxDistance
maximum distance required between track and KLMHit2d to be accepted for efficiency calculation
StoreArray< KLMTrack > m_storeTracks
KLMTrack StoreArray.
StoreArray< KLMHit2d > hits2D
KLMHit2d StoreArray.
TFile * m_file
TFile that store efficieny plots.
std::vector< int > m_totalEvents
total number of processed events
bool isLayerUnderStudy(int section, int iSector, int iLayer, KLMHit2d *hit)
judge whether the current layer is understudy
TH1F * m_total[2][8]
Denominator of each layer.
double distanceToHit(KLMTrack *track, KLMHit2d *hit, double &error, double &sigma)
calculate distance from track to hit
unsigned int m_maxHitList
max number of hits in sector for track finder to run
std::vector< int > m_totalEventsWithTracks
total number of processed events with at least one BKLMTrack
TH2F * m_effiYZ
Efficieny at global position Y vs Z.
bool isSectorUnderStudy(int section, int iSector, KLMHit2d *hit)
judge whether the hits come from the sctor under study
static bool sortByLayer(KLMHit2d *hit1, KLMHit2d *hit2)
my defined sort function using layer number
TH2F * m_totalYZ
total event at global position Y vs Z
~KLMTrackingModule()
Destructor.
bool sameSector(KLMHit2d *hit1, KLMHit2d *hit2)
Judge if two hits come from the same sector.
int m_runTotalEvents
total number of processed events in the run
TH2F * m_passYX
passed event at global position Y vs X
static const bklm::GeometryPar * BarrelInstance()
Return a pointer to the bklm::GeometryPar instance.
static const EKLM::GeometryData * EndcapInstance()
Return a pointer to the EKLM::GeometryData instance.
void setDescription(const std::string &description)
Sets the description of the module.
This is the Reconstruction Event-Data Model Track.
bool addBKLMHit(const UsedBKLMHit *bklmHit, const unsigned int sortingParameter, OriginTrackFinder foundByTrackFinder=OriginTrackFinder::c_undefinedTrackFinder)
Adds a bklm hit with the given information to the reco track.
bool addEKLMHit(const UsedEKLMHit *eklmHit, const unsigned int sortingParameter, OriginTrackFinder foundByTrackFinder=OriginTrackFinder::c_undefinedTrackFinder)
Adds an eklm hit with the given information to the reco track.
unsigned int getNumberOfTotalHits() const
Return the number of cdc + svd + pxd + bklm + eklm hits.
Class for type safe access to objects that are referred to in relations.
size_t size() const
Get number of relations.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
RelationVector< FROM > getRelationsFrom(const std::string &name="", const std::string &namedRelation="") const
Get the relations that point from another store array to this object.
RelationVector< TO > getRelationsTo(const std::string &name="", const std::string &namedRelation="") const
Get the relations that point from this object to another store array.
Type-safe access to single objects in the data store.
static const double cm
Standard units with the value = 1.
Provides BKLM geometry parameters for simulation, reconstruction etc (from Gearbox or DataBase)
const Module * findModule(int section, int sector, int layer) const
Get the pointer to the definition of a module.
double getActiveMiddleRadius(int section, int sector, int layer) const
Get the radial midpoint of the detector module's active volume of specified layer.
Define the geometry of a BKLM module Each sector [octant] contains Modules.
const CLHEP::Hep3Vector globalToLocal(const CLHEP::Hep3Vector &v, bool reco=false) const
Transform space-point within this module from global to local coordinates.
double getPhiStripWidth() const
Get phi-strip width.
const CLHEP::Hep3Vector localToGlobal(const CLHEP::Hep3Vector &v, bool reco=false) const
Transform space-point within this module from local to global coordinates.
double getZStripWidth() const
Get z-strip width.
bool isFlipped() const
Determine if this module is flipped by 180 degrees about z axis within its air gap.
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.
double sqrt(double a)
sqrt for double
ExpRunEvt getPosition(const std::vector< Evt > &events, double tEdge)
Get the exp-run-evt number from the event time [hours].
Abstract base class for different kinds of events.