10 #include <tracking/modules/vxdCDCTrackMerger/VXDCDCTrackMergerModule.h>
12 #include <tracking/trackFitting/fitter/base/TrackFitter.h>
19 Module(), m_CDC_wall_radius(16.25)
22 "This module merges tracks which are reconstructed, separately, in the silicon (PXD+VXD) and in the CDC");
23 setPropertyFlags(c_ParallelProcessingCertified);
26 addParam(
"CDCRecoTrackColName", m_CDCRecoTrackColName,
"CDC Reco Tracks");
27 addParam(
"VXDRecoTrackColName", m_VXDRecoTrackColName,
"VXD Reco Tracks");
30 addParam(
"merge_radius", m_merge_radius,
31 "Maximum distance between extrapolated tracks on the CDC wall",
48 B2DEBUG(9,
"VXDCDCTrackMerger: input Number of CDC Tracks: " << nCDCTracks);
53 "VXDCDCTrackMerger: input Number of VXD Tracks: " << nVXDTracks);
56 TVector3 position(0., 0., 0.);
57 TVector3 momentum(0., 0., 1.);
76 if (!cdcTrack.wasFitSuccessful())
84 bool matched_track =
false;
87 double this_chi_2 = std::numeric_limits<double>::max();
88 double chi_2_max_this_cdc_track = std::numeric_limits<double>::max();
91 cdcTrack.getMeasuredStateOnPlaneFromFirstHit();
93 cdcpos = cdc_sop.getPos();
94 cdcmom = cdc_sop.getMom();
96 B2DEBUG(9,
"CDCTrack extrapolation to cylinder failed!");
101 int currentVxdTrack = -1;
102 int bestMatchedVxdTrack = 0;
106 if (!vxdTrack.wasFitSuccessful()) {
117 vxdTrack.getMeasuredStateOnPlaneFromLastHit();
119 vxdpos = vxd_sop.getPos();
120 vxdmom = vxd_sop.getMom();
123 B2DEBUG(9,
"VXDTrack extrapolation to cylinder failed!");
128 if (TMath::Sqrt((cdcpos - vxdpos) * (cdcpos - vxdpos)) <
m_merge_radius) {
132 vxd_sop = vxdTrack.getMeasuredStateOnPlaneFromLastHit();
133 cdc_sop = cdcTrack.getMeasuredStateOnPlaneFromFirstHit();
135 vxd_sop.extrapolateToPlane(cdc_sop.getPlane());
138 B2DEBUG(9,
"VXDTrack extrapolation to plane failed!");
143 TMatrixDSym inv_covmtrx = (vxd_sop.getCov() + cdc_sop.getCov()).Invert();
144 TVectorD state_diff = cdc_sop.getState() - vxd_sop.getState();
145 state_diff *= inv_covmtrx;
146 this_chi_2 = state_diff * (cdc_sop.getState() - vxd_sop.getState());
148 B2WARNING(
"Matrix is singular!");
152 if ((this_chi_2 < chi_2_max_this_cdc_track) && (this_chi_2 > 0)) {
153 matched_track =
true;
154 chi_2_max_this_cdc_track = this_chi_2;
155 bestMatchedVxdTrack = currentVxdTrack;