Belle II Software  release-08-01-10
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 
20 using namespace Belle2;
21 
23 {
24 
25 }
26 
27 void 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 
73 }
74 
75 void 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)
198  genfit::MeasuredStateOnPlane msopNeg(repNeg);
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
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:652
static const double speedOfLight
[cm/ns]
Definition: Const.h:686
@ 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).
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
T * appendNew()
Construct a new T object at the end of the array.
Definition: StoreArray.h:246
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
Definition: StoreArray.h:140
void initialize() override
Receive and dispatch signal before the start of the event processing.
Abstract base class for a track representation.
Definition: AbsTrackRep.h:66
Detector plane.
Definition: DetPlane.h:59
#StateOnPlane with additional covariance matrix.
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.
std::shared_ptr< genfit::DetPlane > SharedPlanePtr
Shared Pointer to a DetPlane.