14 #define TRG_SHORT_NAMES
15 #define TRGCDC_SHORT_NAMES
18 #include "cdc/dataobjects/CDCSimHit.h"
19 #include "trg/trg/Debug.h"
20 #include "trg/trg/Utilities.h"
21 #include "trg/cdc/TRGCDC.h"
22 #include "trg/cdc/Layer.h"
23 #include "trg/cdc/Cell.h"
24 #include "trg/cdc/Wire.h"
25 #include "trg/cdc/WireHit.h"
26 #include "trg/cdc/PerfectFinder.h"
27 #include "trg/cdc/Segment.h"
28 #include "trg/cdc/SegmentHit.h"
29 #include "trg/cdc/Circle.h"
30 #include "trg/cdc/Track.h"
31 #include "trg/cdc/Link.h"
34 #include "trg/cdc/DisplayRphi.h"
35 namespace Belle2_TRGCDC {
36 extern Belle2::TRGCDCDisplayRphi* D;
38 using namespace Belle2_TRGCDC;
50 TRGCDCPerfectFinder::version(
void)
const
52 return string(
"TRGCDCPerfectFinder 5.24");
55 TRGCDCPerfectFinder::TRGCDCPerfectFinder(
const string& name,
57 : _name(name), _cdc(
TRGCDC)
69 trackListClone = trackList;
81 map<int, vector<const TCSegment*> *> trackMap;
83 for (
unsigned i = 0; i < hits.size(); i++) {
84 const TCSHit& ts = * hits[i];
85 if (! ts.signal().active())
continue;
86 if (ts.segment().stereo())
continue;
88 const TCWHit* wh = ts.segment().priority().hit();
92 if (! trackMap[trackId]) {
93 trackMap[trackId] =
new vector<const TCSegment*>();
96 trackMap[trackId]->push_back(& ts.segment());
100 cout <<
TRGDebug::tab() <<
"#tracksInMC=" << trackMap.size() << endl;
101 map<int, vector<const TCSegment*> *>::iterator it = trackMap.begin();
102 while (it != trackMap.end()) {
104 const vector<const TCSegment*>& l = * it->second;
105 for (
unsigned i = 0; i < l.size(); i++)
106 cout << l[i]->
name() <<
",";
113 map<int, vector<const TCSegment*> *>::iterator it = trackMap.begin();
115 while (it != trackMap.end()) {
118 const vector<const TCSegment*>& l = * it->second;
119 vector<TCLink*> links;
120 for (
unsigned i = 0; i < l.size(); i++) {
121 TCLink* link =
new TCLink(0,
123 l[i]->hit()->cell().xyPosition());
124 links.push_back(link);
128 const unsigned nSuperLayers = TCLink::nSuperLayers(links);
129 if (nSuperLayers < 5) {
135 vector<TCLink*> layers[9];
136 vector<TCLink*> forCircle;
137 TCLink::separate(links, 9, layers);
138 for (
unsigned i = 0; i < 9; i++) {
139 if (layers[i].size() < 1)
continue;
140 if (layers[i].size() < 2) {
141 forCircle.push_back(layers[i][0]);
146 float timeMin = 99999;
147 bool bestCenterHit = 0;
148 for (
unsigned j = 0; j < layers[i].size(); j++) {
150 const float tsDrift = layers[i][j]->cell()->hit()->drift();
156 if (centerHit == 1 && bestCenterHit == 0) {
160 }
else if (centerHit == 0 && bestCenterHit == 1) {
162 if (tsDrift < timeMin) {
168 forCircle.push_back(best);
172 TCLink::dump(forCircle,
177 TCCircle c = TCCircle(forCircle);
179 c.name(
"CircleFitted_" + TRGUtil::itostring(n));
182 TCTrack& t = *
new TCTrack(c);
183 t.name(
"Track_" + TRGUtil::itostring(n));
184 trackList.push_back(& t);
195 #ifdef TRGCDC_DISPLAY_HOUGH
196 vector<const TCCircle*> cc;
198 vector<const TCTrack*> tt;
200 string stg =
"2D : Perfect Finder circle fit";
205 D->area().append(cc, Gdk::Color(
"#FF0066009900"));
216 cout <<
TRGDebug::tab() <<
"#tracksMade=" << trackList.size() << endl;