BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MucMark.cxx
Go to the documentation of this file.
1//------------------------------------------------------------------------------|
2// [File ]: MucMark.cxx |
3// [Brief ]: Source file of MucMark class for encapsulation |
4// [Author]: Xie Yuguang, <ygxie@mail.ihep.ac.cn> |
5// [Date ]: Oct 19, 2006 |
6//------------------------------------------------------------------------------|
7
8#include <cmath>
9#include <iostream>
10#include <vector>
11
12#include "MucCalib/MucMark.h"
13#include "MucCalib/MucStructConst.h"
14
15using namespace std;
16
17// Constructor
18MucMark::MucMark( int part, int segment, int layer, int strip ) {
19 m_Part = part;
20 m_Segment = segment;
21 m_Layer = layer;
22 m_Strip = strip;
23}
24
25// Destructor
27
28// Operator ==
30 if ( this == &other ) return true;
31
32 if ( ( *this ).Part() == other.Part() && ( *this ).Segment() == other.Segment() &&
33 ( *this ).Layer() == other.Layer() && ( *this ).Strip() == other.Strip() )
34 return true;
35 else return false;
36}
37
38// Set properties
39bool MucMark::SetPart( int part ) {
40 if ( part > PART_MAX || part < 0 )
41 {
42 cout << "part overflow:\t" << part << endl;
43 return false;
44 }
45 else
46 {
47 m_Part = part;
48 return true;
49 }
50}
51
52bool MucMark::SetSegment( int segment ) {
53 if ( segment > ( ( m_Part == BRID ) ? B_SEG_NUM : E_SEG_NUM ) || segment < 0 )
54 {
55 cout << "segment overflow:\t" << segment << endl;
56 return false;
57 }
58 else
59 {
60 m_Segment = segment;
61 return true;
62 }
63}
64
65bool MucMark::SetLayer( int layer ) {
66 if ( layer > ( ( m_Part == BRID ) ? B_LAY_NUM : E_LAY_NUM ) || layer < 0 )
67 {
68 cout << "layer overflow:\t" << layer << endl;
69 return false;
70 }
71 else
72 {
73 m_Layer = layer;
74 return true;
75 }
76}
77
78bool MucMark::SetStrip( int strip ) {
79 if ( strip > STRIP_INBOX_MAX || strip < 0 )
80 {
81 cout << "strip overflow:\t" << strip << endl;
82 return false;
83 }
84 else
85 {
86 m_Strip = strip;
87 return true;
88 }
89}
90
91// Get properties
92int MucMark::Part() { return m_Part; }
93int MucMark::Segment() { return m_Segment; }
94int MucMark::Layer() { return m_Layer; }
95int MucMark::Strip() { return m_Strip; }
96
97// Judge whether mark itself is in a Col or not
98int MucMark::IsInCol( int part, int segment, int layer, int strip, mark_col& aCol ) {
99 for ( unsigned int i = 0; i < aCol.size(); i++ )
100 {
101 if ( part == aCol[i]->Part() && segment == aCol[i]->Segment() &&
102 layer == aCol[i]->Layer() && strip == aCol[i]->Strip() )
103 return i;
104 }
105
106 return -1;
107}
108
110 for ( unsigned int i = 0; i < aCol.size(); i++ )
111 {
112 if ( ( *this ) == ( *aCol[i] ) ) return i;
113 }
114
115 return -1;
116}
117
118int MucMark::IsInCol( vector<mark_col>& aClusterCol ) {
119 for ( unsigned int i = 0; i < aClusterCol.size(); i++ )
120 {
121 if ( ( *this ).IsInCol( aClusterCol[i] ) ) return i;
122 }
123
124 return -1;
125}
126
127// Return the number of mark itself in a Col
129 int num = 0;
130
131 for ( unsigned int i = 0; i < aCol.size(); i++ )
132 {
133 if ( ( *this ) == ( *aCol[i] ) ) num++;
134 }
135
136 return num;
137}
138
139// Judge whether mark itself is in the same segment with the other
141 if ( ( *this ).Part() == other.Part() && ( *this ).Segment() == other.Segment() )
142 return true;
143 else return false;
144}
145
146// Judge whether mark itself is in the same box with the other
148 if ( ( *this ).Part() == other.Part() && ( *this ).Segment() == other.Segment() &&
149 ( *this ).Layer() == other.Layer() )
150 return true;
151 else return false;
152}
153
154// Judge whether mark itself is a neighbor with the other
156 if ( ( *this ).Part() == other.Part() && ( *this ).Segment() == other.Segment() &&
157 ( *this ).Layer() == other.Layer() && fabs( ( *this ).Strip() - other.Strip() ) == 1 )
158 return true;
159 else return false;
160}
161
162// Judge whether mark itself is a neighbor with a multi hit
164 for ( unsigned int i = 0; i < aCluster.size(); i++ )
165 {
166 if ( ( *this ).IsNeighborWith( ( *aCluster[i] ) ) ) return true;
167 }
168
169 return false;
170}
171
172// Return a cluster Col from a given mark Col
173vector<mark_col> MucMark::CreateClusterCol_A( mark_col& aMarkCol ) {
174 vector<mark_col> aClusterCol;
175 mark_col checkedMarkCol;
176
177 int recordFlag = 0;
178 unsigned int circle = 0;
179
180 for ( unsigned int i = 0; i < aMarkCol.size(); i++ )
181 {
182 recordFlag = 0;
183 for ( unsigned int j = 0; j < aClusterCol.size(); j++ )
184 {
185 if ( ( *aMarkCol[i] ).IsInCol( aClusterCol[j] ) != -1 )
186 {
187 recordFlag = 1;
188 break;
189 }
190 else if ( ( *aMarkCol[i] ).IsNeighborWith( aClusterCol[j] ) )
191 {
192 aClusterCol[j].push_back( aMarkCol[i] );
193 recordFlag = 1;
194 break;
195 }
196 }
197
198 if ( recordFlag == 0 )
199 {
200 mark_col aCluster;
201 aCluster.push_back( aMarkCol[i] );
202 aClusterCol.push_back( aCluster );
203
204 circle = 0;
205 do {
206 circle++;
207 for ( unsigned int j = i + 1; j < aMarkCol.size(); j++ )
208 {
209 if ( ( *aMarkCol[j] ).IsInCol( aClusterCol.back() ) != -1 ) continue;
210 else if ( ( *aMarkCol[j] ).IsNeighborWith( aClusterCol.back() ) )
211 aClusterCol.back().push_back( aMarkCol[j] );
212 }
213 } while ( circle < aMarkCol.size() - i - 1 );
214 }
215 }
216
217 return aClusterCol;
218}
219
220vector<mark_col> MucMark::CreateClusterCol_B( mark_col& aMarkCol ) {
221 vector<mark_col> aClusterCol;
222 mark_col checkedMarkCol;
223
224 unsigned int circle = 0;
225 for ( unsigned int i = 0; i < aMarkCol.size(); i++ )
226 {
227 if ( ( *aMarkCol[i] ).IsInCol( checkedMarkCol ) != -1 ) continue;
228
229 mark_col aCluster;
230 aCluster.push_back( aMarkCol[i] );
231 aClusterCol.push_back( aCluster );
232 checkedMarkCol.push_back( aMarkCol[i] );
233
234 circle = 0;
235 do {
236 for ( unsigned int j = i + 1; j < aMarkCol.size(); j++ )
237 {
238 if ( ( *aMarkCol[j] ).IsInCol( checkedMarkCol ) != -1 ) continue;
239 else if ( ( *aMarkCol[j] ).IsNeighborWith( aClusterCol.back() ) )
240 {
241 aClusterCol.back().push_back( aMarkCol[j] );
242 checkedMarkCol.push_back( aMarkCol[j] );
243 }
244 }
245 circle++;
246 } while ( circle < aMarkCol.size() - i - 1 );
247 }
248
249 return aClusterCol;
250}
251
252vector<mark_col> MucMark::CreateClusterCol_C( mark_col& aMarkCol ) {
253 MucMark tmpMark;
254 vector<mark_col> aClusterCol;
255 mark_col copyMarkCol;
256 copyMarkCol = aMarkCol;
257
258 mark_col::iterator it1;
259 while ( copyMarkCol.size() != 0 ) // while 1
260 {
261 it1 = copyMarkCol.begin();
262 mark_col aCluster;
263 aCluster.push_back( copyMarkCol[0] );
264 aClusterCol.push_back( aCluster );
265
266 copyMarkCol.erase( it1 );
267 unsigned int circle = 0;
268 unsigned int size = 0;
269 unsigned int beginsize = copyMarkCol.size();
270 while ( circle < beginsize ) // while 2
271 {
272 mark_col::iterator it2;
273 size = copyMarkCol.size();
274 for ( unsigned int j = 0, headNum = 0; j < size; j++ )
275 {
276 it2 = copyMarkCol.begin() + headNum;
277 if ( ( copyMarkCol[headNum] )->IsNeighborWith( aClusterCol.back() ) )
278 {
279 aClusterCol.back().push_back( ( copyMarkCol[headNum] ) );
280 copyMarkCol.erase( it2 );
281 }
282 else headNum++;
283 } // end for
284
285 circle++;
286 }; // End while 2
287
288 }; // End while 1
289
290 return aClusterCol;
291}
292
293vector<mark_col> MucMark::CreateClusterCol_D( mark_col& aMarkCol ) {
294 vector<mark_col> aClusterCol;
295
296 bool recordFlag = false;
297 unsigned int circle = 0;
298
299 for ( unsigned int i = 0; i < aMarkCol.size(); i++ )
300 {
301 recordFlag = false;
302 for ( int j = aClusterCol.size() - 1; j > -1; j-- )
303 {
304 if ( ( *aMarkCol[i] ).IsInCol( aClusterCol[j] ) != -1 )
305 {
306 recordFlag = true;
307 break;
308 }
309 else if ( ( *aMarkCol[i] ).IsNeighborWith( aClusterCol[j] ) )
310 {
311 aClusterCol[j].push_back( aMarkCol[i] );
312 recordFlag = true;
313 break;
314 }
315 }
316
317 if ( recordFlag == false )
318 {
319 mark_col aCluster;
320 aCluster.push_back( aMarkCol[i] );
321 aClusterCol.push_back( aCluster );
322
323 circle = 0;
324 do {
325 circle++;
326 for ( unsigned int j = i + 1; j < aMarkCol.size(); j++ )
327 {
328 if ( ( *aMarkCol[j] ).IsInCol( aClusterCol.back() ) != -1 ) continue;
329 else if ( ( *aMarkCol[j] ).IsNeighborWith( aClusterCol.back() ) )
330 aClusterCol.back().push_back( aMarkCol[j] );
331 }
332 } while ( circle < aMarkCol.size() - i - 1 );
333 } // End if recordflag
334 } // End fist for
335
336 return aClusterCol;
337}
338
339vector<mark_col> MucMark::CreateClusterCol( int buildMode, mark_col& aMarkCol ) {
340 vector<mark_col> aClusterCol;
341 switch ( buildMode )
342 {
343 case 1: return CreateClusterCol_A( aMarkCol ); break;
344 case 2: return CreateClusterCol_B( aMarkCol ); break;
345 case 3: return CreateClusterCol_C( aMarkCol ); break;
346 case 4: return CreateClusterCol_D( aMarkCol ); break;
347 default: return ( aClusterCol );
348 }
349}
350
351// Show mark itself
353 cout << "prt: " << m_Part << "\tseg: " << m_Segment << "\tlay: " << m_Layer
354 << "\tstr: " << m_Strip << endl;
355}
356
357void MucMark::Print( mark_col& aMarkCol ) {
358 for ( unsigned int i = 0; i < aMarkCol.size(); i++ ) aMarkCol[i]->Print();
359}
360
361void MucMark::Print( vector<mark_col>& aClusterCol ) {
362 for ( unsigned int i = 0; i < aClusterCol.size(); i++ )
363 for ( unsigned int j = 0; j < aClusterCol[i].size(); j++ ) { aClusterCol[i][j]->Print(); }
364}
365
366// END
vector< MucMark * > mark_col
bool IsInBoxWith(MucMark &other)
Definition MucMark.cxx:147
vector< mark_col > CreateClusterCol_A(mark_col &aMarkCol)
Definition MucMark.cxx:173
int NumInCol(mark_col &aCol)
Definition MucMark.cxx:128
bool IsNeighborWith(MucMark &other)
Definition MucMark.cxx:155
bool IsInSegWith(MucMark &other)
Definition MucMark.cxx:140
vector< mark_col > CreateClusterCol_C(mark_col &aMarkCol)
Definition MucMark.cxx:252
bool SetLayer(int layer)
Definition MucMark.cxx:65
bool SetSegment(int segment)
Definition MucMark.cxx:52
vector< mark_col > CreateClusterCol(int buildMode, mark_col &aMarkCol)
Definition MucMark.cxx:339
bool operator==(MucMark &other)
Definition MucMark.cxx:29
vector< mark_col > CreateClusterCol_D(mark_col &aMarkCol)
Definition MucMark.cxx:293
vector< mark_col > CreateClusterCol_B(mark_col &aMarkCol)
Definition MucMark.cxx:220
int IsInCol(int part, int segment, int layer, int strip, mark_col &aCol)
Definition MucMark.cxx:98
bool SetStrip(int strip)
Definition MucMark.cxx:78
bool SetPart(int part)
Definition MucMark.cxx:39
int Part()
Definition MucMark.cxx:92
~MucMark()
Definition MucMark.cxx:26
int Segment()
Definition MucMark.cxx:93
int Strip()
Definition MucMark.cxx:95
void Print()
Definition MucMark.cxx:352
int Layer()
Definition MucMark.cxx:94