8 #include <tracking/ckf/cdc/findlets/CDCCKFEclSeedCreator.h>
10 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
12 #include <tracking/dataobjects/RecoTrack.h>
13 #include <tracking/ckf/cdc/entities/CDCCKFState.h>
15 #include <framework/core/ModuleParamList.h>
17 #include <framework/gearbox/Const.h>
28 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"inputECLshowersStoreArrayName"),
30 "StoreArray name of the input Shower Store Array.");
32 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"eclSeedRecoTrackStoreArrayName"),
34 "StoreArray name of the output Track Store Array.");
36 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"minimalEnRequirementCluster"),
38 "Minimal energy requirement for the input clusters",
41 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"restrictToForwardSeeds"),
43 "Don't do Ecl seeding in central region to save computing time",
46 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"tanLambdaForwardNeg"),
48 "Up to which (neg) tanLambda value should the seeding be performed",
51 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"tanLambdaForwardPos"),
53 "Up to which (pos) tanLambda value should the seeding be performed",
56 moduleParamList->
addParameter(TrackFindingCDC::prefixed(prefix,
"showerDepth"),
58 "Don't do Ecl seeding in central region to save computing time",
82 const double Eclus = shower.getEnergy();
88 const double thetaClus = shower.getTheta();
89 const double phiClus = shower.getPhi();
90 const double rClus = shower.getR();
92 const double sinTheta = sin(thetaClus);
93 const double cosTheta = cos(thetaClus);
94 const double sinPhi = sin(phiClus);
95 const double cosPhi = cos(phiClus);
97 TVector3 pos(rClus * sinTheta * cosPhi, rClus * sinTheta * sinPhi, rClus * cosTheta);
98 const double tanLambda = pos.Z() / pos.Perp();
110 TVector3 mom = Eclus / pos.Mag() * pos;
118 if (2. * rad < pos.Perp()) {
119 rad = pos.Perp() / 2.0 + 1.0;
123 double q = pos.Perp();
124 double y3 = pos.Y() / 2.0;
125 double x3 = pos.X() / 2.0;
127 double basex = sqrt(rad * rad - q * q / 4.0) * (-pos.Y()) / q;
128 double basey = sqrt(rad * rad - q * q / 4.0) * pos.X() / q;
130 double centerx1 = x3 + basex;
131 double centery1 = y3 + basey;
132 double centerx2 = x3 - basex;
133 double centery2 = y3 - basey;
136 double momx1 = pos.Y() - centery1;
137 double momy1 = - (pos.X() - centerx1);
138 double momx2 = pos.Y() - centery2;
139 double momy2 = - (pos.X() - centerx2);
143 if (momx1 * pos.X() + momy1 * pos.Y() < 0) {
147 if (momx2 * pos.X() + momy2 * pos.Y() < 0) {
153 double mom1abs = sqrt(momx1 * momx1 + momy1 * momy1);
154 double mom2abs = sqrt(momx2 * momx2 + momy2 * momy2);
155 momx1 = momx1 / mom1abs;
156 momy1 = momy1 / mom1abs;
157 momx2 = momx2 / mom2abs;
158 momy2 = momy2 / mom2abs;
160 TVector3 mom1(momx1 * mom.Perp(), momy1 * mom.Perp(), mom.Z());
161 TVector3 mom2(momx2 * mom.Perp(), momy2 * mom.Perp(), mom.Z());
165 bool clockwise1 =
true;
166 bool clockwise2 =
true;
167 if (pos.Y() * mom1.X() - pos.X() * mom1.Y() > 0) {
170 if (pos.Y() * mom2.X() - pos.X() * mom2.Y() > 0) {
174 if (clockwise1 == clockwise2) {
175 B2WARNING(
"Something went wrong during helix extrapolation. Skipping track.");
204 shower.getCovarianceMatrixAsArray(covArray);
207 double dx2 = rClus * cosTheta * cosPhi * rClus * cosTheta * cosPhi * covArray[5]
208 + rClus * sinTheta * sinPhi * rClus * sinTheta * sinPhi * covArray[2];
209 double dy2 = rClus * cosTheta * sinPhi * rClus * cosTheta * sinPhi * covArray[5]
210 + rClus * sinTheta * cosPhi * rClus * sinTheta * cosPhi * covArray[2];
211 double dz2 = rClus * sinTheta * rClus * sinTheta * covArray[5];
213 double dpx2 = std::abs(mom1.X() - mom2.X()) / 4.0 * std::abs(mom1.X() - mom2.X()) / 4.0;
214 double dpy2 = std::abs(mom1.Y() - mom2.Y()) / 4.0 * std::abs(mom1.Y() - mom2.Y()) / 4.0;
215 double dpz2 = 0.25 * 0.25 * mom.Z() * mom.Z();
227 msopNeg.setPosMomCov(pos, momneg, cov);
228 msopNeg.setPlane(planeNeg);
229 msopPos.setPosMomCov(pos, mompos, cov);
230 msopPos.setPlane(planePos);
234 seeds.push_back({seedStateNeg});
236 seeds.push_back({seedStatePos});
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.
static const ChargedStable pion
charged pion particle
static const double speedOfLight
[cm/ns]
@ c_nPhotons
CR is split into n photons (N1)
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...
This is the Reconstruction Event-Data Model Track.
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.
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.
Abstract base class for a track representation.
#StateOnPlane with additional covariance matrix.
void addParameter(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module list.
Abstract base class for different kinds of events.
std::shared_ptr< genfit::DetPlane > SharedPlanePtr
Shared Pointer to a DetPlane.