11 #include <alignment/modules/MergerCosmicTracks/MergerCosmicTracksModule.h>
13 #include <cdc/geometry/CDCGeometryPar.h>
14 #include <ecl/dataobjects/ECLConnectedRegion.h>
15 #include <ecl/dataobjects/ECLShower.h>
16 #include <framework/datastore/StoreArray.h>
17 #include <framework/geometry/B2Vector3.h>
18 #include <mdst/dataobjects/KLMCluster.h>
19 #include <mdst/dataobjects/Track.h>
20 #include <tracking/dataobjects/RecoTrack.h>
21 #include <vxd/geometry/GeoCache.h>
29 setDescription(
"Select cosmic events containing two tracks (up/down) and merge two tracks");
33 "StoreArray containing the RecoTracks to read from and delete afterwards.",
36 "StoreArray to where to copy the merged RecoTrack.",
39 "Flag to using magnetic field during reconstruction.",
52 recoTracks.isRequired();
55 mergedRecoTracks.registerInDataStore();
68 float fittedValuesOfFunctions[3] = {50.2380, 21.9203, 19.8463};
76 upperTrack = firstRecoTrack;
77 lowerTrack = secondRecoTrack;
79 upperTrack = secondRecoTrack;
80 lowerTrack = firstRecoTrack;
85 float totalADCCount = 0;
88 for (
int i = 0; i < CDCHits; i++) {
94 for (
int i = 0; i < CDCHits; i++) {
98 if (totalADCCount / numberOfCDCHits < 115) {
101 fittedValuesOfFunctions[1]);
114 float magnitudeMomentum = momentum.Mag();
118 B2Vector3D newMomentum(newMomentumX, newMomentumY, newMomentumZ);
126 int sortingNumber = 0;
130 for (
int i = 0; i < PXDHits; i++) {
140 for (
int i = 0; i < PXDHits; i++) {
149 for (
int i = 0; i < SVDHits; i++) {
157 for (
int i = 0; i < SVDHits; i++) {
166 for (
int i = 0; i < CDCHits; i++) {
174 for (
int i = CDCHits - 1; i >= 0; i--) {
182 for (
int i = 0; i < BKLMHits; i++) {
190 for (
int i = 0; i < EKLMHits; i++) {
197 for (
int i = 0; i < BKLMHits; i++) {
205 for (
int i = 0; i < EKLMHits; i++) {
235 float fittedValuesOfFunctions[3] = {50.2380, 21.9203, 19.8463};
240 int numberKLMClusterEnoughLayers = 0;
241 for (
int i = 0; i < klmClusterStoreArray.
getEntries(); i++) {
242 if (klmClusterStoreArray[i]->getLayers() > 4) {
243 numberKLMClusterEnoughLayers++;
247 if (eclConnectedRegionStoreArray.
getEntries() == 2 || eclConnectedRegionStoreArray.
getEntries() == 1
248 || numberKLMClusterEnoughLayers == 2 || numberKLMClusterEnoughLayers == 1) {
251 if (track.size() != 0) {
253 if (eclShower.
size() != 0 || recoTrackStoreArray[0]->hasEKLMHits() || recoTrackStoreArray[0]->hasBKLMHits()) {
255 int numberOfCDCHits = recoTrackStoreArray[0]->getNumberOfCDCHits();
256 float totalADCCount = 0;
257 if (recoTrackStoreArray[0]->hasCDCHits()) {
258 int CDCHits = recoTrackStoreArray[0]->getNumberOfCDCHits();
259 for (
int i = 0; i < CDCHits; i++) {
260 totalADCCount = totalADCCount + recoTrackStoreArray[0]->getSortedCDCHitList()[i]->getADCCount();
263 if (totalADCCount / numberOfCDCHits < 115) {
266 fittedValuesOfFunctions[1]);
272 mergedRecoTrack = mergedRecoTracks.
appendNew(recoTrackStoreArray[0]->getPositionSeed(),
273 recoTrackStoreArray[0]->getMomentumSeed(), recoTrackStoreArray[0]->getChargeSeed());
275 B2Vector3D momentum = recoTrackStoreArray[0]->getMomentumSeed();
276 float magnitudeMomentum = momentum.Mag();
280 B2Vector3D newMomentum(newMomentumX, newMomentumY, newMomentumZ);
281 mergedRecoTrack = mergedRecoTracks.
appendNew(recoTrackStoreArray[0]->getPositionSeed(),
282 newMomentum, recoTrackStoreArray[0]->getChargeSeed());
284 mergedRecoTrack->
setTimeSeed(recoTrackStoreArray[0]->getTimeSeed());
286 int sortingNumber = 0;
287 if (recoTrackStoreArray[0]->hasPXDHits()) {
288 int PXDHits = recoTrackStoreArray[0]->getNumberOfPXDHits();
289 for (
int i = 0; i < PXDHits; i++) {
290 if (recoTrackStoreArray[0]->getSortedPXDHitList()[i]->getSize() > 1) {mergedRecoTrack->
addPXDHit(recoTrackStoreArray[0]->getSortedPXDHitList()[i], sortingNumber);}
295 if (recoTrackStoreArray[0]->hasSVDHits()) {
296 int SVDHits = recoTrackStoreArray[0]->getNumberOfSVDHits();
297 for (
int i = 0; i < SVDHits; i++) {
298 mergedRecoTrack->
addSVDHit(recoTrackStoreArray[0]->getSortedSVDHitList()[i], sortingNumber);
302 if (recoTrackStoreArray[0]->hasCDCHits()) {
303 int CDCHits = recoTrackStoreArray[0]->getNumberOfCDCHits();
304 for (
int i = 0; i < CDCHits; i++) {
305 mergedRecoTrack->
addCDCHit(recoTrackStoreArray[0]->getSortedCDCHitList()[i], sortingNumber);
309 if (recoTrackStoreArray[0]->hasBKLMHits()) {
310 int BKLMHits = recoTrackStoreArray[0]->getNumberOfBKLMHits();
311 for (
int i = 0; i < BKLMHits; i++) {
312 mergedRecoTrack->
addBKLMHit(recoTrackStoreArray[0]->getSortedBKLMHitList()[i], sortingNumber);
316 if (recoTrackStoreArray[0]->hasEKLMHits()) {
317 int EKLMHits = recoTrackStoreArray[0]->getNumberOfEKLMHits();
318 for (
int i = 0; i < EKLMHits; i++) {
319 mergedRecoTrack->
addEKLMHit(recoTrackStoreArray[0]->getSortedEKLMHitList()[i], sortingNumber);
329 else if (recoTrackStoreArray.
getEntries() == 2) {
330 if (recoTrackStoreArray[0]->getNumberOfCDCHits() + recoTrackStoreArray[1]->getNumberOfCDCHits() >
m_minimumNumHitCut) {
333 if (trackFirst.
size() != 0 && trackSecond.size() != 0) {
336 if ((eclShowerFirst.
size() != 0 && eclShowerSecond.size() != 0) || ((recoTrackStoreArray[0]->hasEKLMHits()
337 || recoTrackStoreArray[0]->hasBKLMHits()) && (recoTrackStoreArray[1]->hasEKLMHits() || recoTrackStoreArray[1]->hasBKLMHits()))) {
339 MergingTracks(recoTrackStoreArray[0], recoTrackStoreArray[1], mergedRecoTracks);
342 }
else if (eclShowerFirst.
size() != 0 || eclShowerSecond.size() != 0 || recoTrackStoreArray[0]->hasEKLMHits()
343 || recoTrackStoreArray[0]->hasBKLMHits() || recoTrackStoreArray[1]->hasEKLMHits() || recoTrackStoreArray[1]->hasBKLMHits()) {
344 if (eclConnectedRegionStoreArray.
getEntries() == 2 || eclConnectedRegionStoreArray.
getEntries() == 1
346 MergingTracks(recoTrackStoreArray[0], recoTrackStoreArray[1], mergedRecoTracks);
355 for (
int i = 0; i < recoTrackStoreArray.
getEntries(); i++) {
357 if (trackFirst.
size() != 0) {
358 for (
int j = i + 1; j < recoTrackStoreArray.
getEntries(); j++) {
360 if (trackSecond.
size() != 0) {
361 if (recoTrackStoreArray[i]->getNumberOfCDCHits() + recoTrackStoreArray[j]->getNumberOfCDCHits() >
m_minimumNumHitCut) {
364 if (eclShowerFirst.
size() != 0 && eclShowerSecond.size() != 0) {
365 if (eclShowerFirst[0]->getRelationsWith<Track>().
size() == 1 && eclShowerSecond[0]->getRelationsWith<
Track>().size() == 1) {
366 MergingTracks(recoTrackStoreArray[i], recoTrackStoreArray[j], mergedRecoTracks);
369 }
else if ((recoTrackStoreArray[i]->hasEKLMHits() || recoTrackStoreArray[i]->hasBKLMHits())
370 && (recoTrackStoreArray[j]->hasEKLMHits() || recoTrackStoreArray[j]->hasBKLMHits())) {
371 if (recoTrackStoreArray[i]->getNumberOfBKLMHits() + recoTrackStoreArray[i]->getNumberOfEKLMHits() > 3
372 && recoTrackStoreArray[j]->getNumberOfBKLMHits() + recoTrackStoreArray[j]->getNumberOfEKLMHits() > 3) {
373 MergingTracks(recoTrackStoreArray[i], recoTrackStoreArray[j], mergedRecoTracks);