13 #include "TTimeStamp.h"
20 map<int, FairHit*> correctedHits) {
23 cout <<
"PndSttCellTrackletGenerator::SetCorrectedHits" << endl;
24 fCorrectedHits.clear();
26 if (correctedHits.size() != 0) {
28 fCalcWithCorrectedHits =
true;
29 fCorrectedHits = correctedHits;
32 fCalcWithCorrectedHits =
false;
40 cout <<
"PndSttCellTrackletGenerator::RefitTracks()" << endl;
42 fCombiRiemannTrack.clear();
44 fCombiTrackCand.clear();
46 if (fCalcFirstTrackletInf) {
47 fFirstTrackCand.clear();
48 fFirstRiemannTrack.clear();
50 for (map<int, TrackletInf_t>::iterator trackIt =
51 fStartTracklets.begin(); trackIt != fStartTracklets.end();
63 trackletInf.
error = CalcDeviationOfRiemannTrack(riemannTrack);
64 trackletInf.
numErrHits = GetDeviationCount(riemannTrack);
65 fFirstRiemannTrack.push_back(riemannTrack);
70 for (
size_t i = 0;
i < trackletInf.
hitIDs.size(); ++
i) {
72 if (fCalcWithCorrectedHits
73 && (fCorrectedHits.find(trackletInf.
hitIDs.at(
i))
74 != fCorrectedHits.end())) {
77 fCorrectedHits[trackletInf.
hitIDs.at(
i)]->GetEntryNr(),
81 fMapHitToFairLink[trackletInf.
hitIDs.at(
i)],
i);
86 fFirstTrackCand.push_back(trackCand);
91 for (
size_t i = 0;
i < fCombinedData.size();
i++) {
92 fCombinedData[
i].trackletInf = GetTrackletInf(
93 fCombinedData[
i].tracklets);
97 CreatePndTrackCands();
103 cout <<
"PndSttCellTrackletGenerator::PrintInfo()" << endl;
105 cout <<
"#Start Tracklets: " << fStartTracklets.size() << endl;
107 for (map<int, TrackletInf_t>::iterator
i = fStartTracklets.begin();
108 i != fStartTracklets.end(); ++
i) {
109 cout <<
"state: " <<
i->first <<
", tubeIDs: ";
110 for (
size_t j = 0; j <
i->second.hitIDs.size(); ++j)
111 cout << ((
PndSttHit*) fHits[
i->second.hitIDs.at(j)])->GetTubeID()
116 int maxNumMultiState = 0, averageNumMultiState = 0;
118 cout <<
"#Tubes with multistate: " << fMultiStates.size() << endl;
119 for (
map<
int, set<int> >::iterator it = fMultiStates.begin();
120 it != fMultiStates.end(); ++it) {
121 cout << it->first <<
": ";
122 for (set<int>::iterator setIt = it->second.begin();
123 setIt != it->second.end(); ++setIt) {
124 cout << *setIt <<
", ";
126 if (maxNumMultiState < (
int)it->second.size())
127 maxNumMultiState = it->second.size();
128 averageNumMultiState += it->second.size();
132 if (fMultiStates.size() != 0) {
133 averageNumMultiState = averageNumMultiState / fMultiStates.size();
134 cout <<
"Max #MultiState: " << maxNumMultiState
135 <<
", Avergage #MultiState: " << averageNumMultiState << endl;
138 cout <<
"#Found Combinations (recursive): " << fStateCombinations.size()
141 cout <<
"#Accepted Combination of Tracklets: " << fCombinedData.size()
143 for (
size_t i = 0;
i < fCombinedData.size(); ++
i) {
144 cout <<
"Combination #" <<
i << endl;
145 cout <<
"state of tracklets: ";
146 for (set<int>::iterator iter = fCombinedData[
i].tracklets.begin();
147 iter != fCombinedData[
i].tracklets.end(); iter++) {
148 cout << *iter <<
", ";
160 fTimeStamps[18] = TTimeStamp();
163 cout <<
"PndSttCellTrackletGenerator::FindTracks()" << endl;
167 GenerateTrackletsGPU();
169 fTimeStamps[6] = TTimeStamp();
171 fTimeStamps[7] = TTimeStamp();
174 fTimeStamps[8] = fTimeStamps[7];
175 CombineTrackletsMultiStages();
176 fTimeStamps[9] = TTimeStamp();
178 fTimeStamps[10] = fTimeStamps[9];
179 AssignAmbiguousHits();
180 fTimeStamps[11] = TTimeStamp();
183 for (
size_t i = 0;
i < fCombinedData.size();
i++) {
184 fCombinedData[
i].trackletInf = GetTrackletInf(
185 fCombinedData[
i].tracklets);
188 fTimeStamps[12] = TTimeStamp();
190 fTimeStamps[13] = TTimeStamp();
192 fTimeStamps[14] = fTimeStamps[13];
194 fTimeStamps[15] = TTimeStamp();
196 fTimeStamps[16] = fTimeStamps[15];
197 CreatePndTrackCands();
198 fTimeStamps[17] = TTimeStamp();
201 fTimeStamps[19] = fTimeStamps[17];
207 cout <<
"PndSttCellTrackletGenerator::CreatePndTrackCands()" << endl;
213 for (
size_t i = 0;
i < fCombinedData.size(); ++
i) {
217 for (
size_t j = 0; j < fCombinedData[
i].trackletInf.hitIDs.size(); ++j) {
219 int hitIndex = fCombinedData[
i].trackletInf.hitIDs.at(j);
221 if (fCalcWithCorrectedHits
222 && (fCorrectedHits.find(hitIndex) != fCorrectedHits.end())) {
224 trackCand.
AddHit(fCorrectedHits[hitIndex]->GetEntryNr(), j);
226 trackCand.
AddHit(fMapHitToFairLink[hitIndex], j);
230 fCombiTrackCand.push_back(trackCand);
231 fCombiRiemannTrack.push_back(fCombinedData[
i].trackletInf.riemannTrack);
232 fCombiTrack.push_back(
233 fCombinedData[i].trackletInf.riemannTrack.getPndTrack(fBz));
234 fCombiTrack.back().SetLinks(*(trackCand.GetPointerToLinks()));
238 cout <<
"TrackletInf of tracklet-combination: ";
239 fCombinedData[
i].trackletInf.Print();
242 cout <<
"Created PndTrack " << i <<
" :"
243 << fCombinedData[
i].trackletInf.riemannTrack.getPndTrack(
249 for (
size_t i = 0;
i < fTrackletsWithoutCombi.size(); ++
i) {
251 numHits = fStartTracklets[fTrackletsWithoutCombi[
i]].hitIDs.size();
255 for (
int j = 0; j < numHits; ++j) {
258 fStartTracklets[fTrackletsWithoutCombi[
i]].hitIDs[j];
260 if (fCalcWithCorrectedHits
261 && (fCorrectedHits.find(hitIndex) != fCorrectedHits.end())) {
262 trackCand.
AddHit(fCorrectedHits[hitIndex]->GetEntryNr(), j);
264 trackCand.
AddHit(fMapHitToFairLink[hitIndex], j);
270 fStartTracklets[fTrackletsWithoutCombi[
i]].hitIDs);
272 fCombiTrackCand.push_back(trackCand);
273 fCombiRiemannTrack.push_back(trackRefit);
274 fCombiTrack.push_back(trackRefit.
getPndTrack(fBz));
275 fCombiTrack.back().SetLinks(*(trackCand.GetPointerToLinks()));
278 cout <<
"TrackletInf of tracklet without combination: ";
279 fStartTracklets[fTrackletsWithoutCombi[
i]].Print();
282 cout <<
"Created PndTrack " << fCombiTrack.size() - 1 <<
" :"
291 int *sttHits = (
int*) calloc(
NUM_STRAWS,
sizeof(
int));
292 int *hitIndices = (
int*) malloc((
NUM_STRAWS + 1) *
sizeof(int));
301 set<int> unskewedHits;
306 for (
size_t i = 0;
i < fHits.size(); ++
i) {
311 skewedHits.insert(tubeID);
313 unskewedHits.insert(tubeID);
318 int indexCounter = 0;
319 for (set<int>::iterator it = unskewedHits.begin(); it != unskewedHits.end();
321 sttHits[indexCounter] = *it;
322 hitIndices[*it] = indexCounter;
326 for (set<int>::iterator it = skewedHits.begin(); it != skewedHits.end();
328 sttHits[indexCounter] = *it;
329 hitIndices[*it] = indexCounter;
334 unskewedHits.size(), skewedHits.size(), hitIndices);
337 int numSttHits = unskewedHits.size() + skewedHits.size();
339 for (
int i = 0;
i < numSttHits; ++
i) {
340 if (states[
i] != NUM_STRAWS + 1) {
341 fStates[sttHits[
i]] = states[
i];
345 InitStartTracklets();
349 cout <<
"#Start-Tracklets: " << fStartTracklets.size() << endl;
351 cout <<
"Tracklet-Information: " << endl;
352 for (map<int, TrackletInf_t>::iterator it = fStartTracklets.begin();
353 it != fStartTracklets.end(); ++it) {
354 int state = it->first;
357 cout <<
"State: " << state <<
" ";
362 cout <<
"#Short-Tracklets: " << fShortTracklets.size() << endl;
364 cout <<
"Tracklet-Information: " << endl;
365 for (map<int, TrackletInf_t>::iterator it = fShortTracklets.begin();
366 it != fShortTracklets.end(); ++it) {
367 int state = it->first;
370 cout <<
"State: " << state <<
" ";
376 int multiStateOffset = numSttHits;
377 int multiStateTubeID;
379 for (
int i = 0;
i < numSttHits; ++
i) {
381 if (states[
i] == NUM_STRAWS + 1) {
383 set<int> multiStates;
385 if (states[multiStateOffset + j * numSttHits +
i] != 0) {
387 multiStateTubeID=sttHits[states[multiStateOffset + j * numSttHits +
i]];
388 multiStates.insert(fStates[multiStateTubeID]);
393 if(multiStates.size()!=0)
394 fMultiStates[sttHits[
i]] = multiStates;
400 cout <<
"MultiStates: " << endl;
401 for (
map<
int, set<int> >::iterator iter = fMultiStates.begin();
402 iter != fMultiStates.end(); iter++) {
403 cout << iter->first <<
" : ";
404 for (set<int>::iterator iter2 = iter->second.begin();
405 iter2 != iter->second.end(); iter2++) {
406 cout << *iter2 <<
" ";
422 cout <<
"PndSttCellTrackletGenerator::GenerateTracklets()" << endl;
427 for (
size_t i = 0;
i < fHits.size(); ++
i) {
432 fTimeStamps[0] = TTimeStamp();
434 fTimeStamps[1] = TTimeStamp();
437 cout <<
"States of start-tracklets: " << endl;
438 for (map<int, int>::iterator iter = fStates.begin();
439 iter != fStates.end(); iter++) {
440 cout << iter->first <<
" : " << iter->second << endl;
444 fTimeStamps[2] = TTimeStamp();
445 InitStartTracklets();
446 fTimeStamps[3] = TTimeStamp();
450 cout <<
"#Start-Tracklets: " << fStartTracklets.size() << endl;
452 cout <<
"Tracklet-Information: " << endl;
453 for (map<int, TrackletInf_t>::iterator it = fStartTracklets.begin();
454 it != fStartTracklets.end(); ++it) {
455 int state = it->first;
458 cout <<
"State: " << state <<
" ";
463 cout <<
"#Short-Tracklets: " << fShortTracklets.size() << endl;
465 cout <<
"Tracklet-Information: " << endl;
466 for (map<int, TrackletInf_t>::iterator it = fShortTracklets.begin();
467 it != fShortTracklets.end(); ++it) {
468 int state = it->first;
471 cout <<
"State: " << state <<
" ";
477 fTimeStamps[4] = TTimeStamp();
478 EvaluateMultiState();
479 fTimeStamps[5] = TTimeStamp();
482 cout <<
"MultiStates: " << endl;
483 for (
map<
int, set<int> >::iterator iter = fMultiStates.begin();
484 iter != fMultiStates.end(); iter++) {
485 cout << iter->first <<
" : ";
486 for (set<int>::iterator iter2 = iter->second.begin();
487 iter2 != iter->second.end(); iter2++) {
488 cout << *iter2 <<
" ";
499 cout <<
"PndSttCellTrackletGenerator::EvaluateState()" << endl;
512 set<int> plainHitIds;
513 vector<int>::iterator it;
514 map<int, int>::iterator itStates;
515 vector<int> neighbors;
516 map<int, int> tmpStates;
519 plainHitIds.insert(fSeparations[1].begin(), fSeparations[1].end());
520 plainHitIds.insert(fSeparations[2].begin(), fSeparations[2].end());
523 while (currentSum != priorSum) {
525 priorSum = currentSum;
529 for (it = fSeparations[1].begin(); it < fSeparations[1].end(); ++it) {
530 neighbors = fHitNeighbors[(*it)];
533 if (plainHitIds.find(neighbors[0]) != plainHitIds.end()) {
534 newState =
min(fStates[(*it)], fStates[neighbors[0]]);
535 tmpStates[(*it)] = newState;
536 currentSum += newState;
539 tmpStates[(*it)] = fStates[(*it)];
540 currentSum += newState;
545 for (it = fSeparations[2].begin(); it < fSeparations[2].end(); ++it) {
546 neighbors = fHitNeighbors[(*it)];
549 if (plainHitIds.find(neighbors[1]) == plainHitIds.end())
550 neighbors.erase(neighbors.begin() + 1);
551 if (plainHitIds.find(neighbors[0]) == plainHitIds.end())
552 neighbors.erase(neighbors.begin());
555 switch (neighbors.size()) {
557 newState =
min(fStates[(*it)],
558 min(fStates[neighbors[0]], fStates[neighbors[1]]));
561 newState =
min(fStates[(*it)], fStates[neighbors[0]]);
564 newState = fStates[(*it)];
567 tmpStates[(*it)] = newState;
568 currentSum += newState;
573 fStates.insert(tmpStates.begin(), tmpStates.end());
581 cout <<
"PndSttCellTrackletGenerator::EvaluateMultiState()" << endl;
591 set<int> ambiguousHitIds;
592 set<int>::iterator it;
593 map<int, int>::iterator itStates;
594 vector<int> neighbors;
595 map<int, set<int> > tmpStates;
596 map<int, TrackletInf_t>::iterator trackletIt;
599 ambiguousHitIds.insert(fSeparations[3].begin(), fSeparations[3].end());
600 ambiguousHitIds.insert(fSeparations[4].begin(), fSeparations[4].end());
601 ambiguousHitIds.insert(fSeparations[5].begin(), fSeparations[5].end());
602 ambiguousHitIds.insert(fSeparations[6].begin(), fSeparations[6].end());
603 ambiguousHitIds.insert(fSeparations[7].begin(), fSeparations[7].end());
617 cout <<
"EvaluateMultiState: AmbiguousHitIds: ";
618 for (it = ambiguousHitIds.begin(); it != ambiguousHitIds.end(); it++) {
626 while (currentSum != priorSum) {
629 cout <<
"LoopCount: " << loopcount++ <<
" currentSum: "
630 << currentSum <<
" priorSum: " << priorSum << endl;
633 priorSum = currentSum;
636 for (it = ambiguousHitIds.begin(); it != ambiguousHitIds.end(); ++it) {
637 neighbors = fHitNeighbors[(*it)];
640 cout <<
"AmbiguousHitId: " << *it << endl;
641 cout <<
"Neighbors: " << endl;
644 for (
size_t i = 0;
i < neighbors.size();
i++) {
646 cout << neighbors[
i] <<
" : ";
648 if (fStates.count(neighbors[
i]) > 0) {
650 newState.insert(fStates[neighbors[i]]);
653 cout << fStates[neighbors[
i]];
654 }
else if (fMultiStates.count(neighbors[i]) > 0) {
656 newState.insert(fMultiStates[neighbors[i]].begin(),
657 fMultiStates[neighbors[i]].end());
659 for (set<int>::iterator iter =
660 fMultiStates[neighbors[i]].begin();
661 iter != fMultiStates[neighbors[
i]].end();
663 cout << *iter <<
"/";
674 if (newState.size() > 0 && newState.size() > tmpStates[(*it)].size())
675 tmpStates[(*it)] = newState;
678 cout <<
"NewState for " << *it <<
" : ";
681 for (set<int>::iterator stateIter = newState.begin();
682 stateIter != newState.end(); stateIter++) {
684 cout << *stateIter <<
" | ";
685 currentSum += *stateIter;
692 fMultiStates.clear();
693 fMultiStates.insert(tmpStates.begin(), tmpStates.end());
701 cout <<
"void PndSttCellTrackletGenerator::InitStartTracklets()"
704 vector<int>::iterator it;
705 map<int, vector<int> > tmpStartTracklets;
706 map<int, vector<int> >::iterator trackIt;
709 for (it = fSeparations[1].begin(); it < fSeparations[1].end(); ++it) {
710 tmpStartTracklets[fStates[(*it)]].push_back(fMapTubeIdToHit[(*it)]);
713 for (it = fSeparations[2].begin(); it < fSeparations[2].end(); ++it) {
714 tmpStartTracklets[fStates[(*it)]].push_back(fMapTubeIdToHit[(*it)]);
723 cout <<
"Calculation of StartTracklets: " << endl;
724 for (trackIt = tmpStartTracklets.begin();
725 trackIt != tmpStartTracklets.end(); ++trackIt) {
727 state = trackIt->first;
730 trackIt->second.begin(), trackIt->second.end());
732 hitIDs = trackletInf.
hitIDs;
735 trackletInf.
maxID = 0;
736 trackletInf.
endID = state;
741 for (
size_t i = 0;
i < hitIDs.size(); ++
i) {
746 if (fStrawMap->IsSkewedStraw(tubeID)) {
750 IsEndID = IsEndTubeOfTracklet(tubeID);
753 if (tubeID > trackletInf.
maxID) {
756 if (fStrawMap->GetRow(tubeID)
757 == fStrawMap->GetRow(trackletInf.
maxID)) {
769 trackletInf.
maxID = tubeID;
773 if (IsEndID && tubeID != state) {
774 trackletInf.
endID = tubeID;
777 if (fCalcFirstTrackletInf) {
779 trackCand.
AddHit(fMapHitToFairLink[hitIDs[
i]], 0);
784 if (fCalcFirstTrackletInf) {
792 trackletInf.
error = CalcDeviationOfRiemannTrack(riemannTrack);
793 trackletInf.
numErrHits = GetDeviationCount(riemannTrack);
794 fFirstRiemannTrack.push_back(riemannTrack);
797 fFirstTrackCand.push_back(trackCand);
801 cout <<
"RiemannTrack for startTracklet: " << state <<
" - "
805 fStartTracklets[state] = trackletInf;
814 <<
"void PndSttCellTrackletGenerator::CombineTrackletsMultiStages()"
817 map<int, TrackletInf_t>::iterator trackletIt;
820 for (trackletIt = fStartTracklets.begin();
821 trackletIt != fStartTracklets.end(); ++trackletIt) {
824 if (trackletIt->first <= 104) {
826 CombineTrackletsMultiStagesRecursive(trackletIt->first, combi);
830 vector<set<int> >::iterator combiIt;
831 set<int>::iterator setIt;
834 cout <<
"Found combinations: " << endl;
837 for (combiIt = fStateCombinations.begin();
838 combiIt != fStateCombinations.end(); ++combiIt) {
842 trackletInf = GetTrackletInf(*combiIt);
845 for (setIt = (*combiIt).begin(); setIt != (*combiIt).end();
847 cout << (*setIt) <<
" ";
858 fCombinedData.push_back(combi);
871 int stateToCombine, set<int> currentCombi) {
874 cout <<
"CombineTrackletsMultiStagesRecursive, tracklet: "
875 << stateToCombine << endl;
878 newCombi.insert(currentCombi.begin(), currentCombi.end());
879 newCombi.insert(stateToCombine);
884 endID = fStartTracklets[stateToCombine].endID;
886 set<int>::iterator it;
889 cout <<
"neighbors of end-tube " << endID <<
": ";
890 for (
size_t i = 0;
i < fHitNeighbors[endID].size(); ++
i) {
891 cout << fHitNeighbors[endID].at(
i) <<
" ";
899 if (fHitNeighbors[endID].size() == 2) {
903 if (fMultiStates.count(fHitNeighbors[endID].at(0))) {
904 ambiguousID = fHitNeighbors[endID].at(0);
906 }
else if (fMultiStates.count(fHitNeighbors[endID].at(1))) {
907 ambiguousID = fHitNeighbors[endID].at(1);
912 }
else if (fMultiStates.count(fHitNeighbors[endID].at(0))) {
913 ambiguousID = fHitNeighbors[endID].at(0);
916 if (ambiguousID != 0) {
920 for (it = currentCombi.begin(); it != currentCombi.end(); ++it) {
921 if (fMultiStates[ambiguousID].
count(*it)) {
928 if (ambiguousID == 0) {
931 cout <<
"ambiguous id was not found. finish combi: ";
932 for (it = newCombi.begin(); it != newCombi.end(); ++it) {
938 if (newCombi.size() > 1)
939 InsertCombination(newCombi);
944 cout <<
"found ambiguous tube: " << ambiguousID << endl;
946 set<pair<int, int> > pairCombinations;
947 set<pair<int, int> >::iterator pairIt;
951 pairCombinations = CreatePairCombis(stateToCombine,
952 fMultiStates[ambiguousID]);
955 cout <<
"StateToCombine " << stateToCombine <<
" with: ";
956 for (set<int>::iterator iter = fMultiStates[ambiguousID].begin();
957 iter != fMultiStates[ambiguousID].end(); iter++) {
958 cout << *iter <<
" ";
961 cout <<
"results in PairCombinations: ";
962 for (set<pair<int, int> >::iterator iter = pairCombinations.begin();
963 iter != pairCombinations.end(); iter++) {
964 cout << iter->first <<
"/" << iter->second <<
" ";
970 for (pairIt = pairCombinations.begin(); pairIt != pairCombinations.end();
972 combiPartner = pairIt->second;
975 cout <<
"found combipartner: " << combiPartner << endl;
977 if (!newCombi.count(combiPartner))
978 CombineTrackletsMultiStagesRecursive(combiPartner, newCombi);
987 <<
"void PndSttCellTrackletGenerator::InsertCombination(set<int> combination)"
992 set<int>::iterator oldIt;
993 set<int>::iterator newIt;
995 for (
size_t i = 0;
i < fStateCombinations.size(); ++
i) {
997 if (fStateCombinations[
i] == combination) {
1004 fStateCombinations.push_back(combination);
1012 <<
"TrackletInf_t PndSttCellTrackletGenerator::GetTrackletInf(set<int> tracklets)"
1018 if (tracklets.size() > 1) {
1021 int state = 5000, maxID = 0;
1022 bool straight =
false;
1025 for (set<int>::iterator iter = tracklets.begin();
1026 iter != tracklets.end(); ++iter) {
1034 for (set<int>::iterator iter = tracklets.begin();
1035 iter != tracklets.end(); ++iter) {
1036 if (!fStartTracklets[*iter].straight) {
1046 maxID = fStartTracklets[*(--tracklets.end())].maxID;
1051 for (set<int>::iterator iter = tracklets.begin();
1052 iter != tracklets.end(); ++iter) {
1053 maxID =
TMath::Max(maxID, fStartTracklets[*iter].maxID);
1060 inf.
endID = fStartTracklets[*(--tracklets.end())].endID;
1063 for (set<int>::iterator iter = tracklets.begin();
1064 iter != tracklets.end(); ++iter) {
1066 fStartTracklets[*iter].hitIDs.begin(),
1067 fStartTracklets[*iter].hitIDs.end());
1068 inf.
numSkewed += fStartTracklets[*iter].numSkewed;
1086 cout <<
"void PndSttCellTrackletGenerator::SplitData" << endl;
1089 set<int> combinedTracklets;
1092 for (
size_t i = 0;
i < fCombinedData.size(); ++
i) {
1093 for (set<int>::iterator iter = fCombinedData[
i].tracklets.begin();
1094 iter != fCombinedData[
i].tracklets.end(); iter++) {
1095 combinedTracklets.insert(*iter);
1100 map<int, TrackletInf_t>::iterator it;
1101 for (it = fStartTracklets.begin(); it != fStartTracklets.end(); ++it) {
1103 if (combinedTracklets.find(it->first) == combinedTracklets.end()) {
1106 if (it->second.hitIDs.size() - it->second.numSkewed > 2) {
1108 fTrackletsWithoutCombi.push_back(it->first);
1110 fShortTracklets[it->first] = fStartTracklets[it->first];
1121 cout <<
"void PndSttCellTrackletGenerator::AssignAmbiguousHits()"
1125 for (
map<
int, set<int> >::iterator multistateIt = fMultiStates.begin();
1126 multistateIt != fMultiStates.end(); multistateIt++) {
1127 if (multistateIt->second.size() == 1) {
1130 fStartTracklets[*(multistateIt->second.begin())].hitIDs.push_back(
1131 fMapTubeIdToHit[multistateIt->first]);
1134 cout <<
"add " << multistateIt->first
1135 <<
" to (only possible) tracklet "
1136 << *(multistateIt->second.begin()) << endl;
1138 }
else if (multistateIt->second.size() == 2) {
1143 if (fStartTracklets[*(multistateIt->second.begin())].riemannTrack.getNumHits()
1145 fStartTracklets[*(multistateIt->second.begin())].riemannTrack =
1147 fStartTracklets[*(multistateIt->second.begin())].hitIDs);
1150 if (fStartTracklets[*(multistateIt->second.begin())].riemannTrack.getNumHits()
1153 fStartTracklets[*(multistateIt->second.begin())].riemannTrack.dist(
1154 &hit)) < fTUBE_RADIUS) {
1155 fStartTracklets[*(multistateIt->second.begin())].hitIDs.push_back(
1156 fMapTubeIdToHit[multistateIt->first]);
1159 cout <<
"add " << multistateIt->first <<
" to tracklet "
1160 << *(multistateIt->second.begin()) << endl;
1169 cout <<
"void PndSttCellTrackletGenerator::AddRemainingHits()" << endl;
1175 map<int, TrackletInf_t>::iterator it;
1176 for (it = fShortTracklets.begin(); it != fShortTracklets.end(); ++it) {
1179 for (
size_t j = 0; j < fShortTracklets[state].hitIDs.size(); ++j) {
1180 sttHit = (
PndSttHit*) fHits[fShortTracklets[state].hitIDs[j]];
1181 if (!fStrawMap->IsSkewedStraw(sttHit->
GetTubeID())) {
1182 AddHitToBestCombi(fShortTracklets[state].hitIDs[j]);
1193 cout <<
"bool PndSttCellTrackletGenerator::AddHitToBestCombi(int hitID)"
1197 double minDistance = 100, tmpDistance;
1200 int sector = fStrawMap->GetSector(tubeID);
1201 int sectorOfCombi, foundCombi;
1203 for (
size_t i = 0;
i < fCombinedData.size(); ++
i) {
1205 sectorOfCombi = fStrawMap->GetSector(
1206 *(fCombinedData[
i].tracklets.begin()));
1208 if (sector / 3 == sectorOfCombi / 3) {
1210 tmpDistance = CalcDeviation(
1211 fCombinedData[
i].trackletInf.riemannTrack, hitID);
1212 if (tmpDistance < minDistance) {
1213 minDistance = tmpDistance;
1220 if (minDistance < fTUBE_RADIUS) {
1222 fCombinedData[foundCombi].trackletInf.hitIDs.push_back(hitID);
1224 cout <<
"AddHitToBestCombi(): add " << tubeID <<
" to Combi #"
1225 << foundCombi <<
", distance: " << minDistance << endl;
1234 vector<int> hitIDs) {
1238 <<
"PndSttCellTrackletGenerator::CreateRiemannTrack with correction "
1239 << fCalcWithCorrectedHits << endl;
1243 set<int> skewedTubeIdsInTrack;
1246 for (
size_t i = 0;
i < hitIDs.size(); ++
i) {
1249 if (!fStrawMap->IsSkewedStraw(sttHit->
GetTubeID())) {
1251 if (fCalcWithCorrectedHits
1252 && fCorrectedHits.find(hitIDs[
i]) != fCorrectedHits.end()) {
1254 PndRiemannHit riemannHit(fCorrectedHits[hitIDs[i]], hitIDs[i]);
1255 riemannTrack.
addHit(riemannHit);
1259 riemannHit.
setDXYZ(1, 1, 100);
1260 riemannTrack.
addHit(riemannHit);
1263 skewedTubeIdsInTrack.insert(sttHit->
GetTubeID());
1268 cout <<
"#hits: " << riemannTrack.
getNumHits() << endl;
1274 vector<PndRiemannHit>
hits = riemannTrack.
getHits();
1275 cout << endl <<
"RiemannTrack, Input: " << endl;
1276 for (
size_t i = 0;
i < hits.size(); ++
i) {
1277 const FairHit*
hit = hits[
i].hit();
1278 cout <<
"(" << hit->GetX() <<
"|" << hit->GetY() <<
"), ";
1283 riemannTrack.
refit(
false);
1286 cout <<
"Calculated RiemannTrack: " << riemannTrack << endl
1287 <<
"End of Calculation" << endl;
1290 for (set<int>::iterator tubeIter = skewedTubeIdsInTrack.begin();
1291 tubeIter != skewedTubeIdsInTrack.end(); tubeIter++) {
1292 multimap<int, PndSttSkewedHit*>::iterator it, itlow, itup, itbest;
1293 itlow = fCombinedSkewedHits.lower_bound(*tubeIter);
1294 itup = fCombinedSkewedHits.upper_bound(*tubeIter);
1295 itbest = fCombinedSkewedHits.end();
1297 for (it = itlow; it != itup; ++it) {
1300 if (actDist < minDist) {
1305 if (itbest != fCombinedSkewedHits.end()) {
1307 riemannTrack.
addHit(skewedRiemann);
1310 riemannTrack.
refit(
false);
1313 return riemannTrack;
1321 int firstState, set<int> values) {
1325 <<
"set<pair<int, int> > PndSttCellTrackletGenerator::CreatePairCombis(...)"
1329 set<pair<int, int> > result;
1331 if (values.count(firstState) > 0) {
1332 for (set<int>::iterator iter = values.begin(); iter != values.end();
1334 pair<int, int> actualPair;
1335 actualPair.first = firstState;
1336 if (firstState != *iter) {
1337 actualPair.second = *iter;
1338 result.insert(actualPair);
1342 cout <<
"-E- PndSttCellTrackletGenerator::CreatePairCombis Value "
1343 << firstState <<
" is not in set: ";
1344 for (set<int>::iterator iter = values.begin(); iter != values.end();
1346 cout << *iter <<
" ";
1360 <<
"double PndSttCellTrackletGenerator::CalcDeviationOfRiemannTrack(...)"
1367 orig = track.
orig();
1369 double r = track.
r();
1375 pos.Set(hits[
i].
x()[0], hits[
i].
x()[1]);
1377 diff.Set(pos.X() - orig[0], pos.Y() - orig[1]);
1379 sum += (diff.Mod() -
r) * (diff.Mod() -
r);
1389 cout <<
"double PndSttCellTrackletGenerator::CalcDeviation(...)"
1397 double r = track.
r();
1398 orig = track.
orig();
1400 diff.Set(pos.X() - orig[0], pos.Y() - orig[1]);
1410 <<
"int PndSttCellTrackletGenerator::GetDeviationCount(PndRiemannTrack& track)"
1419 orig = track.
orig();
1421 double r = track.
r();
1426 pos.Set(hits[
i].
x()[0], hits[
i].
x()[1]);
1427 diff.Set(pos.X() - orig[0], pos.Y() - orig[1]);
1440 <<
"bool PndSttCellTrackletGenerator::IsEndTubeOfTracklet(int tubeID)"
1445 if (fHitNeighbors[tubeID].size() == 1
1446 || fHitNeighbors[fHitNeighbors[tubeID][0]].size() > 2
1447 || fHitNeighbors[fHitNeighbors[tubeID][1]].size() > 2) {
int * EvaluateAllStates(int *, int *, int, int, int *)
unsigned int getNumHits()
int GetDeviationCount(PndRiemannTrack &track)
double CalcDeviation(PndRiemannTrack &track, int hitID)
std::set< std::pair< int, int > > CreatePairCombis(int firstState, std::set< int > values)
void InitStartTracklets()
#define MAX_MULTISTATE_NUM
void CombineTrackletsMultiStages()
void CombineTrackletsMultiStagesRecursive(int stateToCombine, std::set< int > currentCombi)
std::set< int > tracklets
void SetCorrectedHits(std::map< int, FairHit * > correctedHits)
TrackletInf_t trackletInf
double dist(PndRiemannHit *hit)
#define START_TUBE_ID_SKEWED
void setDXYZ(double dx, double dy, double dz)
void GenerateTrackletsGPU()
void InsertCombination(std::set< int > combination)
void AssignAmbiguousHits()
std::vector< int > hitIDs
void AddHit(UInt_t detId, UInt_t hitId, Double_t rho)
bool IsEndTubeOfTracklet(int tubeID)
static T Min(const T &x, const T &y)
void EvaluateMultiState()
void refit(bool withErrorCalc=true)
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
PndRiemannTrack riemannTrack
#define END_TUBE_ID_SKEWED
static T Max(const T &x, const T &y)
TrackletInf_t GetTrackletInf(std::set< int > tracklets)
void CreatePndTrackCands()
void addHit(PndRiemannHit &hit)
PndRiemannTrack CreateRiemannTrack(std::vector< int > hitIDs)
std::vector< PndRiemannHit > getHits() const
bool AddHitToBestCombi(int hitID)
PndTrack getPndTrack(Double_t B)
double CalcDeviationOfRiemannTrack(PndRiemannTrack &track)