Belle II Software development
CDCCKFEclSeedCreator.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/ckf/cdc/findlets/CDCCKFEclSeedCreator.h>
9
10#include <tracking/trackFindingCDC/utilities/StringManipulation.h>
11
12#include <tracking/dataobjects/RecoTrack.h>
13#include <tracking/ckf/cdc/entities/CDCCKFState.h>
14
15#include <framework/core/ModuleParamList.h>
16
17#include <framework/gearbox/Const.h>
18#include <framework/geometry/VectorUtil.h>
19
20using namespace Belle2;
21
23{
24
25}
26
27void CDCCKFEclSeedCreator::exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix)
28{
29 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "inputECLshowersStoreArrayName"),
31 "StoreArray name of the input Shower Store Array.");
32
33 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "eclSeedRecoTrackStoreArrayName"),
35 "StoreArray name of the output Track Store Array.");
36
37 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "minimalEnRequirementCluster"),
39 "Minimal energy requirement for the input clusters",
41
42 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "restrictToForwardSeeds"),
44 "Don't do Ecl seeding in central region to save computing time",
46
47 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "tanLambdaForwardNeg"),
49 "Up to which (neg) tanLambda value should the seeding be performed",
51
52 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "tanLambdaForwardPos"),
54 "Up to which (pos) tanLambda value should the seeding be performed",
56
57 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix, "showerDepth"),
59 "Don't do Ecl seeding in central region to save computing time",
61}
62
64{
66
68
71
72 m_eclSeedRecoTracks.registerRelationTo(m_inputECLshowers);
73}
74
75void CDCCKFEclSeedCreator::apply(std::vector<CDCCKFPath>& seeds)
76{
77 // loop over all showers and create seed objects
78 for (auto& shower : m_inputECLshowers) {
79 if (shower.getHypothesisId() != ECLShower::c_nPhotons) {
80 continue;
81 }
82
83 const double Eclus = shower.getEnergy();
84 if (Eclus < m_param_minimalEnRequirement) {
85 continue;
86 }
87
88 // Get shower position, momentum
89 const double thetaClus = shower.getTheta();
90 const double phiClus = shower.getPhi();
91 const double rClus = shower.getR();
92
93 const double sinTheta = sin(thetaClus);
94 const double cosTheta = cos(thetaClus);
95 const double sinPhi = sin(phiClus);
96 const double cosPhi = cos(phiClus);
97
98 ROOT::Math::XYZVector pos(rClus * sinTheta * cosPhi, rClus * sinTheta * sinPhi, rClus * cosTheta);
99 const double tanLambda = pos.Z() / pos.Rho();
100
101 // restrict to forward seeds
103 if (tanLambda > m_param_tanLambdaForwardNeg && tanLambda < m_param_tanLambdaForwardPos) {
104 continue;
105 }
106 }
107
108 // Correction if shower is assumed to start in a certain depth
109 pos = pos - m_param_showerDepth / pos.R() * pos;
110
111 ROOT::Math::XYZVector mom = Eclus / pos.R() * pos;
112
113 // Calculate helix trajectory for negative and positive charge seeds
114 // Find center of circular trajectory
115 // factor 1. for charge // speed of light in [cm per ns] // const magnetic field
116 double rad = std::abs(mom.Rho() / (Const::speedOfLight * 1e-4 * 1. * 1.5));
117
118 // Particle would not be able to reach ECL (underestimation of shower energy)
119 if (2. * rad < pos.Rho()) {
120 rad = pos.Rho() / 2.0 + 1.0;
121 }
122
123 // Use pq formula (center of circle has to be on perpendicular line through center of line between (0,0) and seed position)
124 double q = pos.Rho();
125 double y3 = pos.Y() / 2.0;
126 double x3 = pos.X() / 2.0;
127
128 double basex = sqrt(rad * rad - q * q / 4.0) * (-pos.Y()) / q;
129 double basey = sqrt(rad * rad - q * q / 4.0) * pos.X() / q;
130
131 double centerx1 = x3 + basex;
132 double centery1 = y3 + basey;
133 double centerx2 = x3 - basex;
134 double centery2 = y3 - basey;
135
136 // vectors for tangent at seed position (perpendicular to radius at seed position)
137 double momx1 = pos.Y() - centery1;
138 double momy1 = - (pos.X() - centerx1);
139 double momx2 = pos.Y() - centery2;
140 double momy2 = - (pos.X() - centerx2);
141
142 // two solutions (pointing toward and away from center)
143 // make sure that particle moves inwards
144 if (momx1 * pos.X() + momy1 * pos.Y() < 0) {
145 momx1 = -momx1;
146 momy1 = -momy1;
147 }
148 if (momx2 * pos.X() + momy2 * pos.Y() < 0) {
149 momx2 = -momx2;
150 momy2 = -momy2;
151 }
152
153 // scale to unit length
154 double mom1abs = sqrt(momx1 * momx1 + momy1 * momy1);
155 double mom2abs = sqrt(momx2 * momx2 + momy2 * momy2);
156 momx1 = momx1 / mom1abs;
157 momy1 = momy1 / mom1abs;
158 momx2 = momx2 / mom2abs;
159 momy2 = momy2 / mom2abs;
160
161 ROOT::Math::XYZVector mom1(momx1 * mom.Rho(), momy1 * mom.Rho(), mom.Z());
162 ROOT::Math::XYZVector mom2(momx2 * mom.Rho(), momy2 * mom.Rho(), mom.Z());
163
164 // Pick the right momentum for positive/negative charge
165 // Use cross product if momentum vector is (counter)clockwise wrt position vector
166 bool clockwise1 = true;
167 bool clockwise2 = true;
168 if (pos.Y() * mom1.X() - pos.X() * mom1.Y() > 0) {
169 clockwise1 = false;
170 }
171 if (pos.Y() * mom2.X() - pos.X() * mom2.Y() > 0) {
172 clockwise2 = false;
173 }
174
175 if (clockwise1 == clockwise2) {
176 B2WARNING("Something went wrong during helix extrapolation. Skipping track.");
177 continue;
178 }
179
180 ROOT::Math::XYZVector mompos;
181 ROOT::Math::XYZVector momneg;
182 if (clockwise1) {
183 mompos = mom2;
184 momneg = mom1;
185 } else {
186 mompos = mom1;
187 momneg = mom2;
188 }
189
190 // electron and positron hypothesis
191 RecoTrack* eclSeedNeg = m_eclSeedRecoTracks.appendNew(pos, momneg, -1);
192 eclSeedNeg->addRelationTo(&shower);
193 RecoTrack* eclSeedPos = m_eclSeedRecoTracks.appendNew(pos, mompos, +1);
194 eclSeedPos->addRelationTo(&shower);
195
196 // define MeasuredStateOnPlane (use pion hypothesis)
197 genfit::AbsTrackRep* repNeg = RecoTrackGenfitAccess::createOrReturnRKTrackRep(*eclSeedNeg, -Const::pion.getPDGCode());
198 genfit::MeasuredStateOnPlane msopNeg(repNeg);
199 genfit::AbsTrackRep* repPos = RecoTrackGenfitAccess::createOrReturnRKTrackRep(*eclSeedPos, Const::pion.getPDGCode());
200 genfit::MeasuredStateOnPlane msopPos(repPos);
201
202 // set position, momentum, cov, sharedPlanePtr
203 TMatrixDSym cov(6);
204 double covArray[6];
205 shower.getCovarianceMatrixAsArray(covArray);
206
207 // Calculate uncertainties on position from ECLShower
208 double dx2 = rClus * cosTheta * cosPhi * rClus * cosTheta * cosPhi * covArray[5]
209 + rClus * sinTheta * sinPhi * rClus * sinTheta * sinPhi * covArray[2];
210 double dy2 = rClus * cosTheta * sinPhi * rClus * cosTheta * sinPhi * covArray[5]
211 + rClus * sinTheta * cosPhi * rClus * sinTheta * cosPhi * covArray[2];
212 double dz2 = rClus * sinTheta * rClus * sinTheta * covArray[5];
213
214 double dpx2 = std::abs(mom1.X() - mom2.X()) / 4.0 * std::abs(mom1.X() - mom2.X()) / 4.0;
215 double dpy2 = std::abs(mom1.Y() - mom2.Y()) / 4.0 * std::abs(mom1.Y() - mom2.Y()) / 4.0;
216 double dpz2 = 0.25 * 0.25 * mom.Z() * mom.Z();
217
218 cov(0, 0) = dx2;
219 cov(1, 1) = dy2;
220 cov(2, 2) = dz2;
221 cov(3, 3) = dpx2;
222 cov(4, 4) = dpy2;
223 cov(5, 5) = dpz2;
224
225 // set properties of genfit objects
226 genfit::SharedPlanePtr planeNeg(new genfit::DetPlane(XYZToTVector(pos), XYZToTVector(pos)));
227 genfit::SharedPlanePtr planePos(new genfit::DetPlane(XYZToTVector(pos), XYZToTVector(pos)));
228 msopNeg.setPosMomCov(XYZToTVector(pos), XYZToTVector(momneg), cov);
229 msopNeg.setPlane(planeNeg);
230 msopPos.setPosMomCov(XYZToTVector(pos), XYZToTVector(mompos), cov);
231 msopPos.setPlane(planePos);
232
233 // create CDCCKF states
234 CDCCKFState seedStateNeg(eclSeedNeg, msopNeg);
235 seeds.push_back({seedStateNeg});
236 CDCCKFState seedStatePos(eclSeedPos, msopPos);
237 seeds.push_back({seedStatePos});
238 }
239}
StoreArray< ECLShower > m_inputECLshowers
Input ECL Showers Store Array.
CDCCKFEclSeedCreator()
Add the subfindlets.
bool m_param_restrictToForwardSeeds
Don't do Ecl seeding in central region to save computing time.
void apply(std::vector< CDCCKFPath > &seeds) override
Load in the reco tracks and the hits.
double m_param_minimalEnRequirement
Minimal pt requirement.
void initialize() override
Create the store arrays.
std::string m_param_inputEclShowerStoreArrayName
StoreArray name of the input Ecl Shower Store Array.
std::string m_param_eclSeedRecoTrackStoreArrayName
StoreArray name of the output Track Store Array.
StoreArray< RecoTrack > m_eclSeedRecoTracks
Output Reco Tracks Store Array.
double m_param_tanLambdaForwardNeg
Up to which (neg) tanLambda value should the seeding be performed.
double m_param_tanLambdaForwardPos
Up to which (pos) tanLambda value should the seeding be performed.
double m_param_showerDepth
Correction if the shower is assumed to start in a certain depth.
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) override
Expose the parameters of the sub findlets.
Define states for CKF algorithm, which can be seed track or CDC wire hit.
Definition: CDCCKFState.h:25
static const ChargedStable pion
charged pion particle
Definition: Const.h:661
static const double speedOfLight
[cm/ns]
Definition: Const.h:695
@ c_nPhotons
CR is split into n photons (N1)
Definition: ECLShower.h:42
The Module parameter list class.
static genfit::AbsTrackRep * createOrReturnRKTrackRep(RecoTrack &recoTrack, int PDGcode)
Checks if a TrackRap for the PDG id of the RecoTrack (and its charge conjugate) does already exit and...
Definition: RecoTrack.cc:409
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:79
static void registerRequiredRelations(StoreArray< RecoTrack > &recoTracks, std::string const &pxdHitsStoreArrayName="", std::string const &svdHitsStoreArrayName="", std::string const &cdcHitsStoreArrayName="", std::string const &bklmHitsStoreArrayName="", std::string const &eklmHitsStoreArrayName="", std::string const &recoHitInformationStoreArrayName="")
Convenience method which registers all relations required to fully use a RecoTrack.
Definition: RecoTrack.cc:53
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).
void initialize() override
Receive and dispatch signal before the start of the event processing.
static constexpr auto XYZToTVector
Helper function to convert XYZVector to TVector3.
Definition: VectorUtil.h:24
void addParameter(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
Abstract base class for different kinds of events.