76 std::vector<ECLCluster*> eclClusters;
85 const Track* relatedTrack = cluster.getRelatedFrom<
Track>();
86 if (relatedTrack !=
nullptr)
88 eclClusters.push_back(&cluster);
100 if (trackFitResult) {
101 double trackMomentum = trackFitResult->
getMomentum().R();
103 if (trackMomentum > 5.0) {
104 B2DEBUG(20,
"Track momentum higher than 5GeV! Track is not used for bremsstrahlung finding");
112 B2DEBUG(20,
"Checking track for related ECLCluster");
116 auto relatedClustersToTrack =
119 for (
auto& relatedCluster : relatedClustersToTrack) {
121 primaryClusterOfTrack = &relatedCluster;
131 B2DEBUG(20,
"No RecoTrack for this Track");
135 std::vector<RecoHitInformation*> recoHitInformations =
139 std::vector<std::pair<float, RecoHitInformation*>> extrapolationParams = {};
140 std::vector<genfit::MeasuredStateOnPlane> extrapolatedStates = {};
145 if (hit->useInFit() && recoTrack->hasTrackFitStatus()) {
147 auto measState = recoTrack->getMeasuredStateOnPlaneFromRecoHit(hit);
148 float hitRadius = measState.getPos().Perp();
149 float distance = abs(hitRadius - virtualHitRadius);
152 nearestHitContainer.
add(hit, distance);
154 }
catch (NoTrackFitResult&) {
155 B2DEBUG(29,
"No track fit result available for this hit! Event: " <<
m_evtPtr->getEvent());
158 if (nearestHitContainer.
hasMatch()) {
160 extrapolationParams.push_back({virtualHitRadius, nearestHit});
165 for (
auto param : extrapolationParams) {
166 auto fitted_state = recoTrack->getMeasuredStateOnPlaneFromRecoHit(param.second);
168 fitted_state.extrapolateToCylinder(param.first);
169 extrapolatedStates.push_back(fitted_state);
170 }
catch (genfit::Exception& exception1) {
171 B2DEBUG(20,
"Extrapolation failed!");
174 }
catch (
const genfit::Exception& e) {
175 B2WARNING(
"Exception" << e.what());
184 auto relatedBremHit = cluster->getRelated<
BremHit>();
185 if (relatedBremHit) {
186 B2DEBUG(20,
"Cluster already assumed to be bremsstrahlung cluster!");
190 typedef std::tuple<ECLCluster*, genfit::MeasuredStateOnPlane, double, double > ClusterMSoPPair;
197 if (hit->getTrackingDetector() == RecoHitInformation::c_PXD || hit->getTrackingDetector() == RecoHitInformation::c_SVD) {
199 if (!recoTrack->hasTrackFitStatus()) {
202 auto measState = recoTrack->getMeasuredStateOnPlaneFromRecoHit(hit);
204 if (bremFinder.isMatch()) {
205 ClusterMSoPPair match_pair = std::make_tuple(cluster, measState, bremFinder.getDistanceHitCluster(),
206 bremFinder.getEffAcceptanceFactor());
207 matchContainer.
add(match_pair, bremFinder.getDistanceHitCluster());
209 }
catch (NoTrackFitResult&) {
210 B2DEBUG(29,
"No track fit result available for this hit! Event: " <<
m_evtPtr->getEvent());
211 }
catch (genfit::Exception& e) {
212 B2WARNING(
"Exception" << e.what());
218 for (
auto fitted_state : extrapolatedStates) {
220 if (bremFinder.isMatch()) {
221 ClusterMSoPPair match_pair = std::make_tuple(cluster, fitted_state, bremFinder.getDistanceHitCluster(),
222 bremFinder.getEffAcceptanceFactor());
223 matchContainer.
add(match_pair, bremFinder.getDistanceHitCluster());
231 const auto fitted_state = std::get<1>(matchClustermSoP);
233 const auto fitted_pos = ROOT::Math::XYZVector(fitted_state.getPos());
234 const auto fitted_mom = ROOT::Math::XYZVector(fitted_state.getMom());
236 const auto hit_theta = fitted_mom.Theta();
237 const auto hit_phi = fitted_mom.Phi();
239 B2DEBUG(20,
"Best Cluster" << std::endl
240 <<
" Cluster Phi=" << std::get<0>(matchClustermSoP)->getPhi() <<
" Theta=" << std::get<0>(matchClustermSoP)->getTheta()
241 <<
" TrackHit Phi=" << hit_phi <<
" Theta=" << hit_theta);
247 double effAcceptanceFactor = std::get<3>(matchClustermSoP);
248 ECLCluster* bremCluster = std::get<0>(matchClustermSoP);
249 double clusterDistance = std::get<2>(matchClustermSoP);
254 clusterDistance, effAcceptanceFactor);
258 bremCluster->
addRelationTo(&track, effAcceptanceFactor,
"Bremsstrahlung");
260 if (primaryClusterOfTrack) {
261 primaryClusterOfTrack->
addRelationTo(bremCluster, effAcceptanceFactor);