Belle II Software development
ROIFinder.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8#include <tracking/vxdHoughTracking/findlets/ROIFinder.h>
9#include <tracking/vxdHoughTracking/findlets/RawTrackCandCleaner.icc.h>
10#include <tracking/trackFindingCDC/utilities/StringManipulation.h>
11#include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorCircleFit.h>
12#include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorRiemannHelixFit.h>
13#include <tracking/trackFindingVXD/trackQualityEstimators/QualityEstimatorTripletFit.h>
14#include <framework/logging/Logger.h>
15#include <framework/core/ModuleParamList.h>
16#include <framework/geometry/BFieldManager.h>
17#include <framework/geometry/B2Vector3.h>
18#include <framework/database/DBObjPtr.h>
19#include <mdst/dbobjects/BeamSpot.h>
20#include <pxd/geometry/SensorInfo.h>
21#include <vxd/geometry/GeoCache.h>
22
23using namespace Belle2;
24using namespace TrackFindingCDC;
25using namespace vxdHoughTracking;
26
27ROIFinder::~ROIFinder() = default;
28
30{
31}
32
33void ROIFinder::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
34{
35 Super::exposeParameters(moduleParamList, prefix);
36
37 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "calculateROI"), m_calculateROI,
38 "Calculate PXDIntercepts and ROIs in this findlet based on a simple circle extrapolation (r-phi) and straigh line extrapolation (z, theta)?",
40
41 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "storePXDInterceptsName"), m_storePXDInterceptsName,
42 "Name of the PXDIntercepts StoreArray produced by SVDHoughTracking using a simple circle extrapolation in r-phi and a straight line extrapolation in theta.",
44
45 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "storeROIsName"), m_storeROIsName,
46 "Name of the ROIs StoreArray produced by SVDHoughTracking using a simple circle extrapolation in r-phi and a straight line extrapolation in theta.",
48
49 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "tolerancePhi"), m_tolerancePhi,
50 "Allowed tolerance in phi (in radians) (for ROI calculation in u direction). If the intercept is within this range of the active region, an intercept is created.",
52 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "toleranceZ"), m_toleranceZ,
53 "Allowed tolerance in z (in cm) (for ROI calculation in v direction). If the intercept is within this range of the active region of a sensor, an intercept is created.",
55
56 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "radiusCorrectionFactorL1"), m_radiusCorrectionFactorL1,
57 "Correct charge-dependent bias of the extrapolated hit on L1 with radiusCorrectionFactor * trackCharge / trackRadius.",
59 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "radiusCorrectionFactorL2"), m_radiusCorrectionFactorL2,
60 "Correct charge-dependent bias of the extrapolated hit on L2 with radiusCorrectionFactor * trackCharge / trackRadius.",
62 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "sinPhiCorrectionFactor"), m_sinPhiCorrectionFactor,
63 "Correct sin(trackPhi) dependent bias with sinPhiCorrectionFactor * sin(trackPhi).",
65 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "cosPhiCorrectionFactor"), m_cosPhiCorrectionFactor,
66 "Correct cos(trackPhi) dependent bias with cosPhiCorrectionFactor * cos(trackPhi).",
68
69 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "zPositionCorrectionFactor"), m_zPositionCorrectionFactor,
70 "Correction factor for the extrapolated z position.",
72
73 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minimumROISizeUL1"), m_minimumROISizeUL1,
74 "Minimum ROI size (in pixel) in u direction on L1.", m_minimumROISizeUL1);
75 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minimumROISizeVL1"), m_minimumROISizeVL1,
76 "Minimum ROI size (in pixel) in v direction on L1.", m_minimumROISizeVL1);
77 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minimumROISizeUL2"), m_minimumROISizeUL2,
78 "Minimum ROI size (in pixel) in u direction on L2.", m_minimumROISizeUL2);
79 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minimumROISizeVL2"), m_minimumROISizeVL2,
80 "Minimum ROI size (in pixel) in v direction on L2.", m_minimumROISizeVL2);
81
82 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "multiplierUL1"), m_multiplierUL1,
83 "Multiplier term for ROI size estimation for L1 u direction. Usage: multiplierUL1 * 1/R + minimumROISizeUL1, with R in cm.",
85 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "multiplierUL2"), m_multiplierUL2,
86 "Multiplier term for ROI size estimation for L2 u direction. Usage: multiplierUL2 * 1/R + minimumROISizeUL2, with R in cm.",
88 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "multiplierVL1"), m_multiplierVL1,
89 "Multiplier term for ROI size estimation for L1 v direction. Usage: (1 + abs(tan(lambda)) * multiplierVL1) + minimumROISizeVL1.",
91 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "multiplierVL2"), m_multiplierVL2,
92 "Multiplier term for ROI size estimation for L2 v direction. Usage: (1 + abs(tan(lambda)) * multiplierVL2) + minimumROISizeVL2.",
94
95 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "maximumROISizeU"), m_maximumROISizeU,
96 "Maximum ROI size in u.", m_maximumROISizeU);
97 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "maximumROISizeV"), m_maximumROISizeV,
98 "Maximum ROI size in v.", m_maximumROISizeV);
99
100
101 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "refit"), m_refit,
102 "Refit the track with trackQualityEstimationMethod?", m_refit);
103 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "addVirtualIP"), m_addVirtualIP,
104 "Add virtual IP to fit the tracks again for ROI creation?", m_addVirtualIP);
105 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "ROIFitMethod"), m_ROIFitMethod,
106 "Identifier which fit method to use. Valid identifiers are: [circleFit, tripletFit, helixFit]",
108
109}
110
113{
114 // If no ROIs shall be calculated, return rightaway and don't do anything
115 if (not m_calculateROI) {
116 return;
117 }
118
120
122 m_storeROIs.registerInDataStore(m_storeROIsName);
123
126 m_multiplierUL1 < 0 or m_multiplierUL2 < 0 or
127 m_multiplierVL1 < 0 or m_multiplierVL2 < 0 or
128 m_tolerancePhi < 0 or m_toleranceZ < 0) {
129 B2ERROR("Please check the ROI size parameters. "
130 "None of minimumROISizeUL1, minimumROISizeUL2, minimumROISizeVL1, minimumROISizeVL2, "
131 "multiplierUL1, multiplierUL2, multiplierVL1, multiplierVL2, overlapU, overlapV must be < 0!");
132 }
133
134 if (m_ROIFitMethod == "tripletFit") {
135 m_estimator = std::make_unique<QualityEstimatorTripletFit>();
136 } else if (m_ROIFitMethod == "circleFit") {
137 m_estimator = std::make_unique<QualityEstimatorCircleFit>();
138 } else if (m_ROIFitMethod == "helixFit") {
139 m_estimator = std::make_unique<QualityEstimatorRiemannHelixFit>();
140 }
141 B2ASSERT("QualityEstimator could not be initialized with method: " << m_ROIFitMethod, m_estimator);
142
143};
144
146{
147 // If no ROIs shall be calculated, return rightaway and don't do anything
148 if (not m_calculateROI) {
149 return;
150 }
151
153
155 m_estimator->setMagneticFieldStrength(m_bFieldZ);
156
157 DBObjPtr<BeamSpot> beamSpotDB;
158 if (beamSpotDB.isValid()) {
159 m_BeamSpotPosition = (*beamSpotDB).getIPPosition();
160 const TMatrixDSym posErr = (*beamSpotDB).getIPPositionCovMatrix();
161 m_BeamSpotPositionError.SetXYZ(sqrt(posErr[0][0]), sqrt(posErr[1][1]), sqrt(posErr[2][2]));
162 } else {
163 m_BeamSpotPosition.SetXYZ(0., 0., 0.);
165 }
166}
167
168
170{
171 // If no ROIs shall be calculated, return rightaway and don't do anything
172 if (not m_calculateROI) {
173 return;
174 }
175
177}
178
179void ROIFinder::apply(const std::vector<SpacePointTrackCand>& finalTracks)
180{
181 // If no ROIs shall be calculated, return rightaway and don't do anything
182 if (not m_calculateROI) {
183 return;
184 }
185
186 for (auto& track : finalTracks) {
187 // do nothing if the SpacePointTrackCand is not active
188 if (!track.hasRefereeStatus(SpacePointTrackCand::c_isActive)) {
189 continue;
190 }
191
192 QualityEstimationResults refittedTrackEstimate;
193 if (m_refit) {
194 auto sortedHits = track.getSortedHits();
195
196 if (m_addVirtualIP) {
197 SpacePoint virtualIPSpacePoint = SpacePoint(m_BeamSpotPosition, m_BeamSpotPositionError, {0.5, 0.5}, {false, false},
199 sortedHits.push_back(&virtualIPSpacePoint);
200 }
201
202 std::sort(sortedHits.begin(), sortedHits.end(),
203 [](const SpacePoint * a, const SpacePoint * b) {return a->getPosition().Perp() < b->getPosition().Perp(); });
204
205 refittedTrackEstimate = m_estimator->estimateQualityAndProperties(sortedHits);
206 }
207
208 std::vector<PXDIntercept> thisTracksIntercepts;
209 thisTracksIntercepts.reserve(8);
210
211 B2Vector3D momentumEstimate = track.getMomSeed();
212 if (m_refit) {
213 momentumEstimate = *refittedTrackEstimate.p;
214 }
215
216 const double trackPhi = momentumEstimate.Phi();
217 const double trackTheta = momentumEstimate.Theta();
218 const double tanTrackLambda = tan(M_PI_2 - trackTheta);
219 const double trackRadius = momentumEstimate.Perp() / (0.00299792458 * m_bFieldZ) ;
220 const double trackCharge = track.getChargeSeed();
221
223 for (int layer = 1; layer <= 2; layer++) {
224 const double sensorPerpRadius = c_layerRadius[layer - 1];
225
227 for (int ladder = 1; ladder <= (layer == 1 ? 8 : 12); ladder++) {
228 const double sensorPhi = (layer == 1) ? c_ladderPhiL1[ladder - 1] : c_ladderPhiL2[ladder - 1];
229 const double rotatedBeamSpotX = m_BeamSpotPosition.X() * cos(sensorPhi) + m_BeamSpotPosition.Y() * sin(sensorPhi);
230 const double rotatedBeamSpotY = -m_BeamSpotPosition.X() * sin(sensorPhi) + m_BeamSpotPosition.Y() * cos(sensorPhi);
231
232 // in the rotated coordinate the sensor is perpendicular to the x axis at position sensorLocalX
233 const double sensorLocalX = sensorPerpRadius - rotatedBeamSpotX;
234
235 double phiDiff = trackPhi - sensorPhi;
236 if (phiDiff < -M_PI) {
237 phiDiff += 2. * M_PI;
238 }
239 if (phiDiff > M_PI) {
240 phiDiff -= 2. * M_PI;
241 }
242
243 // Don't try to extrapolate if track direction and sensor are too different (in phi)
244 // this should speed up the calculation as wrong combinations are not checked at all.
245 // Two values to check both the outgoing (0.3) and incoming (0.8) arm.
246 if (fabs(phiDiff) > 0.25 * M_PI and fabs(phiDiff) < 0.75 * M_PI) {
247 continue;
248 }
249 if (fabs(phiDiff) > 0.75 * M_PI and fabs(tanTrackLambda) > 0.2 /*and fabs(trackRadius) > 20*/) {
250 continue;
251 }
252
253
254 // relative phi value of the track center compared to the rotated
255 // coordinate system defined by the (rotated) line perpendicular
256 // to the sensor (with length sensorPerpRadius)
257 double relTrackCenterPhi = 0;
258 if (trackCharge < 0) {
259 relTrackCenterPhi = trackPhi - M_PI_2 - sensorPhi;
260 } else if (trackCharge > 0) {
261 relTrackCenterPhi = trackPhi + M_PI_2 - sensorPhi;
262 }
263 const double xCenter = trackRadius * cos(relTrackCenterPhi);
264 const double yCenter = trackRadius * sin(relTrackCenterPhi);
265
266 // continue if radicant of sqrt is negative
267 if ((trackRadius * trackRadius - (sensorLocalX - xCenter) * (sensorLocalX - xCenter)) < 0) {
268 continue;
269 }
270 const double ytmp = sqrt(trackRadius * trackRadius - (sensorLocalX - xCenter) * (sensorLocalX - xCenter));
271 const double yplus = yCenter + ytmp + rotatedBeamSpotY;
272 const double yminus = yCenter - ytmp + rotatedBeamSpotY;
273
274 const double correctionterm = ((layer == 1 ? m_radiusCorrectionFactorL1 : m_radiusCorrectionFactorL2) * trackCharge /
275 trackRadius) +
276 m_sinPhiCorrectionFactor * sin(trackPhi) +
277 m_cosPhiCorrectionFactor * cos(trackPhi);
278
279 const double localUPositionPlus = yplus - c_shiftY + correctionterm;
280 const double localUPositionMinus = yminus - c_shiftY + correctionterm;
281 const double toleranceRPhi = m_tolerancePhi * sensorLocalX;
282
283 // if the hit for sure is out of reach of the current ladder, continue
284 if (not(yplus >= c_sensorMinY - toleranceRPhi and yplus <= c_sensorMaxY + toleranceRPhi) and
285 not(yminus >= c_sensorMinY - toleranceRPhi and yminus <= c_sensorMaxY + toleranceRPhi)) {
286 continue;
287 }
288
289 // estimate the z coordinate of the extrapolation on this layer
290 const double z = sensorLocalX * tanTrackLambda - m_BeamSpotPosition.Z();
291 const double zPlus = sqrt(sensorLocalX * sensorLocalX + yplus * yplus) * tanTrackLambda * m_zPositionCorrectionFactor -
293 const double zMinus = sqrt(sensorLocalX * sensorLocalX + yminus * yminus) * tanTrackLambda * m_zPositionCorrectionFactor -
295
297 for (int sensor = 1; sensor <= 2; sensor++) {
298
299 const double shiftZ = (layer == 1) ? c_centerZShiftLayer1[sensor - 1] : c_centerZShiftLayer2[sensor - 1];
300
301 double localVPosition = z - shiftZ;
302 double localVPositionPlus = zPlus - shiftZ;
303 double localVPositionMinus = zMinus - shiftZ;
304 // check whether z intersection possibly is on sensor to be checked, only continue with the rest of calculations if that's the case
305 if (localVPosition >= ((-c_activeSensorLength[layer - 1] / 2.0) - m_toleranceZ) and
306 localVPosition <= ((c_activeSensorLength[layer - 1] / 2.0) + m_toleranceZ)) {
307
308 const VxdID sensorID = VxdID(layer, ladder, sensor);
309
310 // check for first option of the intersection
311 if (localUPositionPlus >= -c_activeSensorWidth / 2.0 - toleranceRPhi and
312 localUPositionPlus <= c_activeSensorWidth / 2.0 + toleranceRPhi) {
313 PXDIntercept intercept;
314 intercept.setCoorU(localUPositionPlus);
315 intercept.setCoorV(localVPositionPlus);
316 intercept.setVxdID(sensorID);
317 m_storePXDIntercepts.appendNew(intercept);
318 thisTracksIntercepts.push_back(intercept);
319 }
320 // check for second option of the intersection
321 if (localUPositionMinus >= -c_activeSensorWidth / 2.0 - toleranceRPhi and
322 localUPositionMinus <= c_activeSensorWidth / 2.0 + toleranceRPhi) {
323 PXDIntercept intercept;
324 intercept.setCoorU(localUPositionMinus);
325 intercept.setCoorV(localVPositionMinus);
326 intercept.setVxdID(sensorID);
327 m_storePXDIntercepts.appendNew(intercept);
328 thisTracksIntercepts.push_back(intercept);
329 }
330 }
331 }
332 }
333 }
334
335 const double omega = 1. / trackRadius;
336 unsigned short uSizeL1 = (unsigned short)(m_multiplierUL1 * omega + m_minimumROISizeUL1);
337 unsigned short uSizeL2 = (unsigned short)(m_multiplierUL2 * omega + m_minimumROISizeUL2);
338 unsigned short vSizeL1 = (unsigned short)((1. + fabs(tanTrackLambda) * m_multiplierVL1) * m_minimumROISizeVL1);
339 unsigned short vSizeL2 = (unsigned short)((1. + fabs(tanTrackLambda) * m_multiplierVL2) * m_minimumROISizeVL2);
340 for (auto& intercept : thisTracksIntercepts) {
341 const VxdID& interceptSensorID = intercept.getSensorID();
342
343 double uCoordinate = intercept.getCoorU();
344 double vCoordinate = intercept.getCoorV();
345
346 const PXD::SensorInfo* currentSensor = dynamic_cast<const PXD::SensorInfo*>(&VXD::GeoCache::getInstance().getSensorInfo(
347 interceptSensorID));
348
349 int interceptUCell = currentSensor->getUCellID(uCoordinate, vCoordinate, false);
350 int interceptVCell = currentSensor->getVCellID(vCoordinate, false);
351 int nUCells = currentSensor->getUCells();
352 int nVCells = currentSensor->getVCells();
353
354 unsigned short uSize = (interceptSensorID.getLayerNumber() == 1 ? uSizeL1 : uSizeL2);
355 unsigned short vSize = (interceptSensorID.getLayerNumber() == 1 ? vSizeL1 : vSizeL2);
356 if (uSize > m_maximumROISizeU) {
357 uSize = m_maximumROISizeU;
358 }
359 if (vSize > m_maximumROISizeV) {
360 vSize = m_maximumROISizeV;
361 }
362
364 short uCellDownLeft = interceptUCell - uSize / 2;
365 short vCellDownLeft = interceptVCell - vSize / 2;
366
368 short uCellUpRight = interceptUCell + uSize / 2;
369 short vCellUpRight = interceptVCell + vSize / 2;
370
371 if (uCellDownLeft >= nUCells or vCellDownLeft >= nVCells or uCellUpRight < 0 or vCellUpRight < 0) {
372 continue;
373 }
374
375 if (uCellDownLeft < 0) {
376 uCellDownLeft = 0;
377 }
378 if (vCellDownLeft < 0) {
379 vCellDownLeft = 0;
380 }
381
382 // minimum cell id is 0, maximum is nCells - 1
383 if (uCellUpRight >= nUCells) {
384 uCellUpRight = nUCells - 1;
385 }
386 if (vCellUpRight >= nVCells) {
387 vCellUpRight = nVCells - 1;
388 }
389
390 m_storeROIs.appendNew(ROIid(uCellDownLeft, uCellUpRight, vCellDownLeft, vCellUpRight, interceptSensorID));
391 }
392
393 }
394}
395
DataType Phi() const
The azimuth angle.
Definition: B2Vector3.h:151
DataType Z() const
access variable Z (= .at(2) without boundary check)
Definition: B2Vector3.h:435
DataType Theta() const
The polar angle.
Definition: B2Vector3.h:153
DataType X() const
access variable X (= .at(0) without boundary check)
Definition: B2Vector3.h:431
DataType Y() const
access variable Y (= .at(1) without boundary check)
Definition: B2Vector3.h:433
DataType Perp() const
The transverse component (R in cylindrical coordinate system).
Definition: B2Vector3.h:200
void SetXYZ(DataType x, DataType y, DataType z)
set all coordinates using data type
Definition: B2Vector3.h:464
bool isValid() const
Check whether a valid object was obtained from the database.
Class for accessing objects in the database.
Definition: DBObjPtr.h:21
The Module parameter list class.
PXDIntercept stores the U,V coordinates and uncertainties of the intersection of a track with an PXD ...
Definition: PXDIntercept.h:22
Specific implementation of SensorInfo for PXD Sensors which provides additional pixel specific inform...
Definition: SensorInfo.h:23
ROIid stores the U and V ids and the sensor id of the Region Of Interest.
Definition: ROIid.h:25
@ c_isActive
bit 11: SPTC is active (i.e.
SpacePoint typically is build from 1 PXDCluster or 1-2 SVDClusters.
Definition: SpacePoint.h:42
void initialize() override
Receive and dispatch signal before the start of the event processing.
void beginRun() override
Receive and dispatch signal for the beginning of a new run.
void beginEvent() override
Receive and dispatch signal for the start of a new event.
virtual void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix)
Forward prefixed parameters of this findlet to the module parameter list.
Definition: Findlet.h:69
static const double T
[tesla]
Definition: Unit.h:120
void setVxdID(VxdID::baseType user_vxdID)
set the sensor ID
Definition: VXDIntercept.h:77
void setCoorU(double user_coorU)
set the U coordinate of the intercept
Definition: VXDIntercept.h:70
void setCoorV(double user_coorV)
set the V coordinate of the intercept
Definition: VXDIntercept.h:71
const SensorInfoBase & getSensorInfo(Belle2::VxdID id) const
Return a referecne to the SensorInfo of a given SensorID.
Definition: GeoCache.cc:67
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition: GeoCache.cc:214
int getVCells() const
Return number of pixel/strips in v direction.
@ VXD
Any type of VXD Sensor.
int getUCells() const
Return number of pixel/strips in u direction.
int getVCellID(double v, bool clamp=false) const
Return the corresponding pixel/strip ID of a given v coordinate.
int getUCellID(double u, double v=0, bool clamp=false) const
Return the corresponding pixel/strip ID of a given u coordinate.
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:33
baseType getLayerNumber() const
Get the layer id.
Definition: VxdID.h:96
double m_radiusCorrectionFactorL2
Correction factor for radial bias for L2: factor * charge / radius.
Definition: ROIFinder.h:98
unsigned short m_maximumROISizeV
maximum ROI size in v in pixel
Definition: ROIFinder.h:133
double m_minimumROISizeUL1
Minimum size of ROI in u-direction on L1 in pixel.
Definition: ROIFinder.h:110
const double c_ladderPhiL2[12]
Phi values of the ladders of L2.
Definition: ROIFinder.h:159
B2Vector3D m_BeamSpotPosition
B2Vector3D actually contining the BeamSpot position. This will be used as the starting point of the e...
Definition: ROIFinder.h:166
bool m_calculateROI
Calculate ROI in this findlet?
Definition: ROIFinder.h:61
~ROIFinder()
Default desctructor.
double m_multiplierVL1
Multiplier term for v-direction on L1.
Definition: ROIFinder.h:126
double m_radiusCorrectionFactorL1
Correction factor for radial bias for L1: factor * charge / radius.
Definition: ROIFinder.h:96
const double c_centerZShiftLayer2[2]
Shift of the center of the active area of each sensor in a ladder of layer 2 For use of mhp_z > (leng...
Definition: ROIFinder.h:142
double m_minimumROISizeVL2
Minimum size of ROI in v-direction on L2 in pixel.
Definition: ROIFinder.h:116
double m_multiplierUL2
Multiplier term for u-direction on L2.
Definition: ROIFinder.h:124
const double c_centerZShiftLayer1[2]
Shift of the center of the active area of each sensor in a ladder of layer 1 For use of mhp_z > (leng...
Definition: ROIFinder.h:139
void initialize() override
Initialize the StoreArrays.
Definition: ROIFinder.cc:112
double m_multiplierVL2
Multiplier term for v-direction on L2.
Definition: ROIFinder.h:128
StoreArray< ROIid > m_storeROIs
ROIs StoreArray.
Definition: ROIFinder.h:71
double m_sinPhiCorrectionFactor
Correction factor for the sin(phi) modulation.
Definition: ROIFinder.h:100
const double c_activeSensorLength[2]
Length of the active region for L1 and L2.
Definition: ROIFinder.h:155
const double c_sensorMaxY
Maximum y coordinate if x-axis is perpendicular to the sensor:
Definition: ROIFinder.h:147
std::string m_ROIFitMethod
Refit with this estimator, options are circleFit, tripletFit, helixFit.
Definition: ROIFinder.h:79
const double c_ladderPhiL1[8]
Phi values of the ladders of L1.
Definition: ROIFinder.h:157
double m_tolerancePhi
Allowed tolerance (in radians) phi to create intercepts per sensor.
Definition: ROIFinder.h:87
std::string m_storeROIsName
Name of the ROIs StoreArray.
Definition: ROIFinder.h:67
std::string m_storePXDInterceptsName
Name of the PXDIntercepts StoreArray.
Definition: ROIFinder.h:65
const double c_layerRadius[2]
Radius of the two layers.
Definition: ROIFinder.h:153
void apply(const std::vector< SpacePointTrackCand > &finalTracks) override
Function to call all the sub-findlets.
Definition: ROIFinder.cc:179
bool m_addVirtualIP
Add a virtual IP for the refit?
Definition: ROIFinder.h:77
StoreArray< PXDIntercept > m_storePXDIntercepts
PXDIntercepts StoreArray.
Definition: ROIFinder.h:69
void beginRun() override
Initialize the BField.
Definition: ROIFinder.cc:145
B2Vector3D m_BeamSpotPositionError
B2Vector3D actually contining the BeamSpot position error.
Definition: ROIFinder.h:168
bool m_refit
Refit the tracks with m_ROIFitMethod.
Definition: ROIFinder.h:75
double m_zPositionCorrectionFactor
Correction factor for the z position.
Definition: ROIFinder.h:105
void beginEvent() override
Clear the object pools.
Definition: ROIFinder.cc:169
double m_cosPhiCorrectionFactor
Correction factor for the cos(phi) modulation.
Definition: ROIFinder.h:102
std::unique_ptr< QualityEstimatorBase > m_estimator
pointer to the selected QualityEstimator
Definition: ROIFinder.h:82
double m_bFieldZ
BField in Tesla.
Definition: ROIFinder.h:162
double m_minimumROISizeVL1
Minimum size of ROI in v-direction on L1 in pixel.
Definition: ROIFinder.h:112
const double c_shiftY
Shift of the center position in y if the x-axis is perpendicular to the sensor:
Definition: ROIFinder.h:151
const double c_sensorMinY
PXD is shifted to create the windmill structure.
Definition: ROIFinder.h:145
double m_minimumROISizeUL2
Minimum size of ROI in u-direction on L2 in pixel.
Definition: ROIFinder.h:114
unsigned short m_maximumROISizeU
maximum ROI size in u in pixel
Definition: ROIFinder.h:131
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) override
Expose the parameters of the sub findlets.
Definition: ROIFinder.cc:33
ROIFinder()
Constructor for adding the subfindlets.
Definition: ROIFinder.cc:29
double m_multiplierUL1
Multiplier term in ROI size estimation For u: size = multiplier * 1/R + minimumROISize For v: size = ...
Definition: ROIFinder.h:122
double m_toleranceZ
Allowed tolerance (in cm) in z to create intercepts per sensor.
Definition: ROIFinder.h:89
const double c_activeSensorWidth
PXD sensors in L1 and L2 have the same size in u direction (=width):
Definition: ROIFinder.h:149
void addParameter(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
static void getField(const double *pos, double *field)
return the magnetic field at a given position.
Definition: BFieldManager.h:91
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
Abstract base class for different kinds of events.
Container for complete fit/estimation results.
std::optional< B2Vector3D > p
momentum vector estimate from the QE