BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EmcRecNeighbor.cxx
Go to the documentation of this file.
1//
2// Define the relationship of crystals
3//
4// Wang.Zhe 2004, 3, 29
5//
6#include <iostream>
7
8#include "EmcRec/EmcRecNeighbor.h"
9
10// Constructors and destructors
12
14
15// 3*3
16bool EmcRecNeighbor::IsNeighbor( const Identifier& id1, const Identifier& id2 ) {
17 bool is;
18 RecEmcIDVector NeighborVec;
20
21 is = false;
22 NeighborVec = GetNeighbors( id1 );
23 for ( ci_NV = NeighborVec.begin(); ci_NV != NeighborVec.end(); ++ci_NV )
24 {
25 if ( ( *ci_NV ) == id2 ) { is = true; }
26 }
27 return is;
28}
29
30// 5*5
32 bool is;
33 RecEmcIDVector NeighborVec;
35
36 is = false;
37 NeighborVec = GetNextNeighbors( id1 );
38 for ( ci_NV = NeighborVec.begin(); ci_NV != NeighborVec.end(); ++ci_NV )
39 {
40 if ( ( *ci_NV ) == id2 ) { is = true; }
41 }
42 return is;
43}
44
45// 3*3 8 ones
47 unsigned int barrel_ec = EmcID::barrel_ec( id );
48 unsigned int theta = EmcID::theta_module( id );
49 unsigned int phi = EmcID::phi_module( id );
50
51 RecEmcID aNb;
52 RecEmcIDVector NeighborVec;
53
54 NeighborVec.clear();
55
56 if ( barrel_ec == EmcID::getBARREL() )
57 {
58 unsigned int phip = 999;
59 unsigned int phin = 999;
60 if ( phi == EmcID::getPHI_BARREL_MIN() )
61 {
63 phin = phi + 1;
64 }
65 if ( phi == EmcID::getPHI_BARREL_MAX() )
66 {
67 phip = phi - 1;
69 }
70 if ( ( phi > EmcID::getPHI_BARREL_MIN() ) && ( phi < EmcID::getPHI_BARREL_MAX() ) )
71 {
72 phip = phi - 1;
73 phin = phi + 1;
74 }
75
76 aNb = EmcID::crystal_id( barrel_ec, theta, phip );
77 NeighborVec.push_back( aNb );
78 aNb = EmcID::crystal_id( barrel_ec, theta, phin );
79 NeighborVec.push_back( aNb );
80
81 if ( ( theta == EmcID::getTHETA_BARREL_MIN() ) ||
82 ( theta == EmcID::getTHETA_BARREL_MAX() ) )
83 {
84 unsigned int east_west = 0;
85 if ( theta == EmcID::getTHETA_BARREL_MIN() )
86 { // theta=0
87 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phip );
88 NeighborVec.push_back( aNb );
89 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phi );
90 NeighborVec.push_back( aNb );
91 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phin );
92 NeighborVec.push_back( aNb );
93 east_west = EmcID::getENDCAP_EAST();
94 }
95 else
96 { // theta=43
97 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phip );
98 NeighborVec.push_back( aNb );
99 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phi );
100 NeighborVec.push_back( aNb );
101 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phin );
102 NeighborVec.push_back( aNb );
103 east_west = EmcID::getENDCAP_WEST();
104 }
105 // neighbors in endcap
106 unsigned int phi1 = phi *
108 ( EmcID::getPHI_BARREL_MAX() + 1 ); // phi1=phi*4/5
110 NeighborVec.push_back( aNb );
111 if ( phi % 5 == 0 )
112 {
113 if ( phi == EmcID::getPHI_BARREL_MIN() )
114 { // phi=0
115 aNb = EmcID::crystal_id(
116 east_west, EmcID::getTHETA_ENDCAP_MAX(),
118 NeighborVec.push_back( aNb );
119 }
120 else
121 {
122 aNb = EmcID::crystal_id( east_west, EmcID::getTHETA_ENDCAP_MAX(), phi1 - 1 );
123 NeighborVec.push_back( aNb );
124 }
125 }
126 else
127 {
128 if ( phi == EmcID::getPHI_BARREL_MAX() )
129 { // phi=119
131 EmcID::getPHI_ENDCAP_MIN() ); // id=(0,5,0)
132 NeighborVec.push_back( aNb );
133 }
134 else
135 {
136 aNb = EmcID::crystal_id( east_west, EmcID::getTHETA_ENDCAP_MAX(), phi1 + 1 );
137 NeighborVec.push_back( aNb );
138 }
139 }
140 }
141
142 else if ( ( theta > EmcID::getTHETA_BARREL_MIN() ) &&
143 ( theta < EmcID::getTHETA_BARREL_MAX() ) )
144 {
145 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phip );
146 NeighborVec.push_back( aNb );
147 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phi );
148 NeighborVec.push_back( aNb );
149 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phin );
150 NeighborVec.push_back( aNb );
151 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phip );
152 NeighborVec.push_back( aNb );
153 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phi );
154 NeighborVec.push_back( aNb );
155 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phin );
156 NeighborVec.push_back( aNb );
157 }
158 }
159
160 else if ( ( barrel_ec == EmcID::getENDCAP_EAST() ) || // endcap
161 ( barrel_ec == EmcID::getENDCAP_WEST() ) )
162 {
163 unsigned int phiInSec = ( EmcID::getPHI_ENDCAP_MAX( theta ) + 1 ) / 16;
164 unsigned int sector = phi / phiInSec;
165 unsigned int phip = 999;
166 unsigned int phin = 999;
167 unsigned int InvalidPhi = 999;
168 if ( phi == EmcID::getPHI_ENDCAP_MIN() )
169 {
170 phip = EmcID::getPHI_ENDCAP_MAX( theta );
171 phin = phi + 1;
172 }
173 else if ( phi == EmcID::getPHI_ENDCAP_MAX( theta ) )
174 {
175 phip = phi - 1;
177 }
178 else if ( ( phi == 4 * phiInSec - 1 ) || ( phi == 12 * phiInSec - 1 ) )
179 { // crystal next to the gap
180 phip = phi - 1;
181 phin = phi + 1; // InvalidPhi;
182 }
183 else if ( ( phi == 4 * phiInSec ) || ( phi == 12 * phiInSec ) )
184 {
185 phip = phi - 1; // InvalidPhi;
186 phin = phi + 1;
187 }
188 else if ( ( ( phi > EmcID::getPHI_ENDCAP_MIN() ) && ( phi < 4 * phiInSec - 1 ) ) ||
189 ( ( phi > 4 * phiInSec ) && ( phi < 12 * phiInSec - 1 ) ) ||
190 ( ( phi > 12 * phiInSec ) && ( phi < EmcID::getPHI_ENDCAP_MAX( theta ) ) ) )
191 {
192 phip = phi - 1;
193 phin = phi + 1;
194 }
195
196 if ( phip != InvalidPhi )
197 {
198 aNb = EmcID::crystal_id( barrel_ec, theta, phip );
199 NeighborVec.push_back( aNb );
200 }
201 if ( phin != InvalidPhi )
202 {
203 aNb = EmcID::crystal_id( barrel_ec, theta, phin );
204 NeighborVec.push_back( aNb );
205 }
206
207 if ( theta == EmcID::getTHETA_ENDCAP_MIN() )
208 { // layer 0
209 if ( phip != InvalidPhi )
210 {
211 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phip );
212 NeighborVec.push_back( aNb );
213 }
214 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phi );
215 NeighborVec.push_back( aNb );
216 if ( phin != InvalidPhi )
217 {
218 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phin );
219 NeighborVec.push_back( aNb );
220 }
221 }
222
223 else if ( theta == EmcID::getTHETA_ENDCAP_MAX() )
224 { // layer 5
225 if ( phip != InvalidPhi )
226 {
227 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phip );
228 NeighborVec.push_back( aNb );
229 }
230 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phi );
231 NeighborVec.push_back( aNb );
232 if ( phin != InvalidPhi )
233 {
234 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phin );
235 NeighborVec.push_back( aNb );
236 }
237
238 unsigned int phi1 =
239 phi * ( EmcID::getPHI_BARREL_MAX() + 1 ) / ( EmcID::getPHI_ENDCAP_MAX( theta ) + 1 );
240 unsigned int min_max = 0;
241 if ( barrel_ec == EmcID::getENDCAP_EAST() ) { min_max = EmcID::getTHETA_BARREL_MIN(); }
242 else { min_max = EmcID::getTHETA_BARREL_MAX(); }
243 aNb = EmcID::crystal_id( EmcID::getBARREL(), min_max, phi1 );
244 NeighborVec.push_back( aNb );
245 aNb = EmcID::crystal_id( EmcID::getBARREL(), min_max, phi1 + 1 );
246 NeighborVec.push_back( aNb );
247 if ( phi % 4 == 0 )
248 {
249 if ( phi == EmcID::getPHI_ENDCAP_MIN() )
250 {
252 NeighborVec.push_back( aNb );
253 }
254 else
255 {
256 aNb = EmcID::crystal_id( EmcID::getBARREL(), min_max, phi1 - 1 );
257 NeighborVec.push_back( aNb );
258 }
259 }
260 else if ( phi % 4 == 3 )
261 {
262 if ( phi == EmcID::getPHI_ENDCAP_MAX( theta ) )
263 {
265 NeighborVec.push_back( aNb );
266 }
267 else
268 {
269 aNb = EmcID::crystal_id( EmcID::getBARREL(), min_max, phi1 + 2 );
270 NeighborVec.push_back( aNb );
271 }
272 }
273 }
274
275 else if ( ( theta == EmcID::getTHETA_ENDCAP_MIN() + 1 ) || // layer 1,3
276 ( theta == EmcID::getTHETA_ENDCAP_MIN() + 3 ) )
277 {
278 if ( phip != InvalidPhi )
279 {
280 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phip );
281 NeighborVec.push_back( aNb );
282 }
283 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phi );
284 NeighborVec.push_back( aNb );
285 if ( phin != InvalidPhi )
286 {
287 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phin );
288 NeighborVec.push_back( aNb );
289 }
290
291 unsigned int phi1 = phi * ( phiInSec + 1 ) / phiInSec;
292 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phi1 );
293 NeighborVec.push_back( aNb );
294 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phi1 + 1 );
295 NeighborVec.push_back( aNb );
296 if ( phi % phiInSec == 0 )
297 {
298 if ( sector == 0 )
299 {
300 aNb =
301 EmcID::crystal_id( barrel_ec, theta + 1, EmcID::getPHI_ENDCAP_MAX( theta + 1 ) );
302 NeighborVec.push_back( aNb );
303 }
304 else
305 {
306 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phi1 - 1 );
307 NeighborVec.push_back( aNb );
308 }
309 }
310 else if ( phi % phiInSec == phiInSec - 1 )
311 {
312 if ( sector == 15 )
313 {
314 aNb = EmcID::crystal_id( barrel_ec, theta + 1, EmcID::getPHI_ENDCAP_MIN() );
315 NeighborVec.push_back( aNb );
316 }
317 else
318 {
319 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phi1 + 2 );
320 NeighborVec.push_back( aNb );
321 }
322 }
323 }
324
325 else if ( ( theta == EmcID::getTHETA_ENDCAP_MIN() + 2 ) || // layer 2,4
326 ( theta == EmcID::getTHETA_ENDCAP_MIN() + 4 ) )
327 {
328 unsigned int phi1 = phi * ( phiInSec - 1 ) / phiInSec;
329 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phi1 );
330 NeighborVec.push_back( aNb );
331 if ( phi % phiInSec == 0 )
332 {
333 if ( sector == 0 )
334 {
335 aNb =
336 EmcID::crystal_id( barrel_ec, theta + 1, EmcID::getPHI_ENDCAP_MAX( theta - 1 ) );
337 NeighborVec.push_back( aNb );
338 }
339 else
340 {
341 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phi1 - 1 );
342 NeighborVec.push_back( aNb );
343 }
344 }
345 else
346 {
347 if ( phi == EmcID::getPHI_ENDCAP_MAX( theta ) )
348 {
349 aNb = EmcID::crystal_id( barrel_ec, theta - 1, EmcID::getPHI_ENDCAP_MIN() );
350 NeighborVec.push_back( aNb );
351 }
352 else
353 {
354 aNb = EmcID::crystal_id( barrel_ec, theta - 1, phi1 + 1 );
355 NeighborVec.push_back( aNb );
356 }
357 }
358
359 if ( phip != InvalidPhi )
360 {
361 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phip );
362 NeighborVec.push_back( aNb );
363 }
364 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phi );
365 NeighborVec.push_back( aNb );
366 if ( phin != InvalidPhi )
367 {
368 aNb = EmcID::crystal_id( barrel_ec, theta + 1, phin );
369 NeighborVec.push_back( aNb );
370 }
371 }
372 }
373
374 return NeighborVec;
375}
376
377// 5*5 16 ones
379 unsigned int barrel_ec = EmcID::barrel_ec( id );
380 unsigned int theta = EmcID::theta_module( id );
381 unsigned int phi = EmcID::phi_module( id );
382
383 RecEmcID aNb;
384 RecEmcIDVector NeighborVec;
385
386 NeighborVec.clear();
387
388 // if(barrel_ec==EmcID::getBARREL()) {
389 if ( 0 )
390 { // not used now
391 unsigned int phip, phipp;
392 unsigned int phin, phinn;
393 unsigned int thetap, thetapp;
394 unsigned int thetan, thetann;
395 unsigned int invalidTheta = 999999;
396 if ( phi == EmcID::getPHI_BARREL_MIN() )
397 {
398 phipp = EmcID::getPHI_BARREL_MAX() - 1;
400 phin = phi + 1;
401 phinn = phi + 2;
402 }
403 if ( phi == EmcID::getPHI_BARREL_MIN() + 1 )
404 {
405 phipp = EmcID::getPHI_BARREL_MAX();
406 phip = phi - 1;
407 phin = phi + 1;
408 phinn = phi + 2;
409 }
410 if ( phi == EmcID::getPHI_BARREL_MAX() - 1 )
411 {
412 phipp = phi - 2;
413 phip = phi - 1;
414 phin = phi + 1;
415 phinn = EmcID::getPHI_BARREL_MIN();
416 }
417 if ( phi == EmcID::getPHI_BARREL_MAX() )
418 {
419 phipp = phi - 2;
420 phip = phi - 1;
422 phinn = EmcID::getPHI_BARREL_MIN() + 1;
423 }
424 if ( ( phi > EmcID::getPHI_BARREL_MIN() + 1 ) && ( phi < EmcID::getPHI_BARREL_MAX() - 1 ) )
425 {
426 phipp = phi - 2;
427 phip = phi - 1;
428 phin = phi + 1;
429 phinn = phi + 2;
430 }
431
432 if ( theta == EmcID::getTHETA_BARREL_MIN() )
433 {
434 thetapp = invalidTheta;
435 thetap = invalidTheta;
436 thetan = theta + 1;
437 thetann = theta + 2;
438 }
439 if ( theta == EmcID::getTHETA_BARREL_MIN() + 1 )
440 {
441 thetapp = invalidTheta;
442 thetap = theta - 1;
443 thetan = theta + 1;
444 thetann = theta + 2;
445 }
446 if ( ( theta > EmcID::getTHETA_BARREL_MIN() + 1 ) &&
447 ( theta < EmcID::getTHETA_BARREL_MAX() - 1 ) )
448 {
449 thetapp = theta - 2;
450 thetap = theta - 1;
451 thetan = theta + 1;
452 thetann = theta + 2;
453 }
454 if ( theta == EmcID::getTHETA_BARREL_MAX() - 1 )
455 {
456 thetapp = theta - 2;
457 thetap = theta - 1;
458 thetan = theta + 1;
459 thetann = invalidTheta;
460 }
461 if ( theta == EmcID::getTHETA_BARREL_MAX() )
462 {
463 thetapp = theta - 2;
464 thetap = theta - 1;
465 thetan = invalidTheta;
466 thetann = invalidTheta;
467 }
468
469 // Check them out.
470 // cout<<phipp<<" "<<phip<<" "<<phi<<" "<<phin<<" "<<phinn<<endl;
471 // cout<<thetapp<<" "<<thetap<<" "<<theta<<" "<<thetan<<" "<<thetann<<endl;
472
473 aNb = EmcID::crystal_id( barrel_ec, theta, phipp );
474 NeighborVec.push_back( aNb );
475 aNb = EmcID::crystal_id( barrel_ec, theta, phinn );
476 NeighborVec.push_back( aNb );
477
478 if ( thetapp != invalidTheta )
479 {
480 aNb = EmcID::crystal_id( barrel_ec, thetapp, phipp );
481 NeighborVec.push_back( aNb );
482 aNb = EmcID::crystal_id( barrel_ec, thetapp, phip );
483 NeighborVec.push_back( aNb );
484 aNb = EmcID::crystal_id( barrel_ec, thetapp, phi );
485 NeighborVec.push_back( aNb );
486 aNb = EmcID::crystal_id( barrel_ec, thetapp, phin );
487 NeighborVec.push_back( aNb );
488 aNb = EmcID::crystal_id( barrel_ec, thetapp, phinn );
489 NeighborVec.push_back( aNb );
490 }
491 if ( thetap != invalidTheta )
492 {
493 aNb = EmcID::crystal_id( barrel_ec, thetap, phipp );
494 NeighborVec.push_back( aNb );
495 aNb = EmcID::crystal_id( barrel_ec, thetap, phinn );
496 NeighborVec.push_back( aNb );
497 }
498 if ( thetan != invalidTheta )
499 {
500 aNb = EmcID::crystal_id( barrel_ec, thetan, phipp );
501 NeighborVec.push_back( aNb );
502 aNb = EmcID::crystal_id( barrel_ec, thetan, phinn );
503 NeighborVec.push_back( aNb );
504 }
505 if ( thetann != invalidTheta )
506 {
507 aNb = EmcID::crystal_id( barrel_ec, thetann, phipp );
508 NeighborVec.push_back( aNb );
509 aNb = EmcID::crystal_id( barrel_ec, thetann, phip );
510 NeighborVec.push_back( aNb );
511 aNb = EmcID::crystal_id( barrel_ec, thetann, phi );
512 NeighborVec.push_back( aNb );
513 aNb = EmcID::crystal_id( barrel_ec, thetann, phin );
514 NeighborVec.push_back( aNb );
515 aNb = EmcID::crystal_id( barrel_ec, thetann, phinn );
516 NeighborVec.push_back( aNb );
517 }
518 }
519
520 // else if((barrel_ec==EmcID::getENDCAP_EAST()) || //endcap
521 //(barrel_ec==EmcID::getENDCAP_WEST())) {
522 else
523 {
524 RecEmcIDVector tmpNeighborVec, tmpNextNeighborVec;
525 ci_RecEmcIDVector ci_NV, ci_tmpNV, ci_tmpNV1, ci_tmpNNV;
526 tmpNeighborVec = GetNeighbors( id );
527 bool flag = false; // whether NeighborVec already includes this crystal
528 bool flagNeighbor = false; // whether this crystal belongs to NeighborVec
529
530 //------------------------------------------------------------------
531 for ( ci_tmpNV = tmpNeighborVec.begin(); ci_tmpNV != tmpNeighborVec.end(); ci_tmpNV++ )
532 {
533 tmpNextNeighborVec = GetNeighbors( *ci_tmpNV );
534 //================================================================
535 for ( ci_tmpNNV = tmpNextNeighborVec.begin(); ci_tmpNNV != tmpNextNeighborVec.end();
536 ci_tmpNNV++ )
537 {
538
539 for ( ci_NV = NeighborVec.begin(); ci_NV != NeighborVec.end(); ci_NV++ )
540 {
541 if ( *ci_tmpNNV == *ci_NV )
542 { // this crystal is already included
543 flag = true;
544 continue;
545 }
546 }
547
548 if ( !flag )
549 { // find a new crystal
550 for ( ci_tmpNV1 = tmpNeighborVec.begin(); ci_tmpNV1 != tmpNeighborVec.end();
551 ci_tmpNV1++ )
552 {
553 if ( *ci_tmpNNV == *ci_tmpNV1 )
554 { // this crystal belongs to NeighborVec
555 flagNeighbor = true;
556 continue;
557 }
558 }
559
560 if ( *ci_tmpNNV == id ) flagNeighbor = true;
561
562 if ( !flagNeighbor ) NeighborVec.push_back( *ci_tmpNNV );
563 else flagNeighbor = false;
564 }
565 else flag = false;
566 }
567 //================================================================
568 }
569 //------------------------------------------------------------------
570 }
571
572 return NeighborVec;
573}
Double_t phi1
RecEmcIDVector::const_iterator ci_RecEmcIDVector
static unsigned int getPHI_BARREL_MAX()
Definition EmcID.cxx:83
static Identifier crystal_id(const unsigned int barrel_ec, const unsigned int theta_module, const unsigned int phi_module)
For a single crystal.
Definition EmcID.cxx:63
static unsigned int getENDCAP_WEST()
Definition EmcID.cxx:99
static unsigned int barrel_ec(const Identifier &id)
Values of different levels (failure returns 0).
Definition EmcID.cxx:36
static unsigned int getENDCAP_EAST()
Definition EmcID.cxx:95
static unsigned int getTHETA_ENDCAP_MIN()
Definition EmcID.cxx:82
static unsigned int getTHETA_ENDCAP_MAX()
Definition EmcID.cxx:81
static unsigned int getBARREL()
Definition EmcID.cxx:97
static unsigned int getTHETA_BARREL_MIN()
Definition EmcID.cxx:80
static unsigned int getTHETA_BARREL_MAX()
Definition EmcID.cxx:79
static unsigned int theta_module(const Identifier &id)
Definition EmcID.cxx:41
static unsigned int getPHI_ENDCAP_MAX(const unsigned int theta)
Definition EmcID.cxx:85
static unsigned int getPHI_ENDCAP_MIN()
Definition EmcID.cxx:91
static unsigned int getPHI_BARREL_MIN()
Definition EmcID.cxx:84
static unsigned int phi_module(const Identifier &id)
Definition EmcID.cxx:46
bool IsNextNeighbor(const Identifier &id1, const Identifier &id2)
RecEmcIDVector GetNeighbors(const Identifier &id)
bool IsNeighbor(const Identifier &id1, const Identifier &id2)
RecEmcIDVector GetNextNeighbors(const Identifier &id)