00001
00002
00003
00004
00005
00006 #include <iostream>
00007
00008 #include "EmcRec/EmcRecNeighbor.h"
00009
00010
00011 EmcRecNeighbor::EmcRecNeighbor()
00012 {}
00013
00014 EmcRecNeighbor::~EmcRecNeighbor()
00015 {}
00016
00017
00018 bool EmcRecNeighbor::IsNeighbor(const Identifier& id1,
00019 const Identifier& id2)
00020 {
00021 bool is;
00022 RecEmcIDVector NeighborVec;
00023 ci_RecEmcIDVector ci_NV;
00024
00025 is=false;
00026 NeighborVec=GetNeighbors(id1);
00027 for(ci_NV=NeighborVec.begin();
00028 ci_NV!=NeighborVec.end();
00029 ++ci_NV) {
00030 if((*ci_NV)==id2) { is=true; }
00031 }
00032 return is;
00033 }
00034
00035
00036 bool EmcRecNeighbor::IsNextNeighbor(const Identifier& id1,
00037 const Identifier& id2)
00038 {
00039 bool is;
00040 RecEmcIDVector NeighborVec;
00041 ci_RecEmcIDVector ci_NV;
00042
00043 is=false;
00044 NeighborVec=GetNextNeighbors(id1);
00045 for(ci_NV=NeighborVec.begin();
00046 ci_NV!=NeighborVec.end();
00047 ++ci_NV) {
00048 if((*ci_NV)==id2) { is=true; }
00049 }
00050 return is;
00051 }
00052
00053
00054 RecEmcIDVector EmcRecNeighbor::GetNeighbors(const Identifier& id)
00055 {
00056 unsigned int barrel_ec=EmcID::barrel_ec(id);
00057 unsigned int theta=EmcID::theta_module(id);
00058 unsigned int phi=EmcID::phi_module(id);
00059
00060 RecEmcID aNb;
00061 RecEmcIDVector NeighborVec;
00062
00063 NeighborVec.clear();
00064
00065 if(barrel_ec==EmcID::getBARREL()) {
00066 unsigned int phip=999;
00067 unsigned int phin=999;
00068 if(phi==EmcID::getPHI_BARREL_MIN()) {
00069 phip=EmcID::getPHI_BARREL_MAX();
00070 phin=phi+1;
00071 }
00072 if(phi==EmcID::getPHI_BARREL_MAX()) {
00073 phip=phi-1;
00074 phin=EmcID::getPHI_BARREL_MIN();
00075 }
00076 if((phi>EmcID::getPHI_BARREL_MIN()) &&
00077 (phi<EmcID::getPHI_BARREL_MAX())) {
00078 phip=phi-1;
00079 phin=phi+1;
00080 }
00081
00082 aNb=EmcID::crystal_id(barrel_ec,theta,phip);
00083 NeighborVec.push_back(aNb);
00084 aNb=EmcID::crystal_id(barrel_ec,theta,phin);
00085 NeighborVec.push_back(aNb);
00086
00087 if((theta==EmcID::getTHETA_BARREL_MIN()) || (theta==EmcID::getTHETA_BARREL_MAX())) {
00088 unsigned int east_west=0;
00089 if(theta==EmcID::getTHETA_BARREL_MIN()) {
00090 aNb=EmcID::crystal_id(barrel_ec,theta+1,phip);
00091 NeighborVec.push_back(aNb);
00092 aNb=EmcID::crystal_id(barrel_ec,theta+1,phi);
00093 NeighborVec.push_back(aNb);
00094 aNb=EmcID::crystal_id(barrel_ec,theta+1,phin);
00095 NeighborVec.push_back(aNb);
00096 east_west=EmcID::getENDCAP_EAST();
00097 } else {
00098 aNb=EmcID::crystal_id(barrel_ec,theta-1,phip);
00099 NeighborVec.push_back(aNb);
00100 aNb=EmcID::crystal_id(barrel_ec,theta-1,phi);
00101 NeighborVec.push_back(aNb);
00102 aNb=EmcID::crystal_id(barrel_ec,theta-1,phin);
00103 NeighborVec.push_back(aNb);
00104 east_west=EmcID::getENDCAP_WEST();
00105 }
00106
00107 unsigned int phi1=phi*(EmcID::getPHI_ENDCAP_MAX(EmcID::getTHETA_ENDCAP_MAX())+1)
00108 /(EmcID::getPHI_BARREL_MAX()+1);
00109 aNb=EmcID::crystal_id(east_west,EmcID::getTHETA_ENDCAP_MAX(),phi1);
00110 NeighborVec.push_back(aNb);
00111 if(phi%5==0) {
00112 if(phi==EmcID::getPHI_BARREL_MIN()) {
00113 aNb=EmcID::crystal_id(east_west,EmcID::getTHETA_ENDCAP_MAX(),
00114 EmcID::getPHI_ENDCAP_MAX(EmcID::getTHETA_ENDCAP_MAX()));
00115 NeighborVec.push_back(aNb);
00116 } else {
00117 aNb=EmcID::crystal_id(east_west,EmcID::getTHETA_ENDCAP_MAX(),phi1-1);
00118 NeighborVec.push_back(aNb);
00119 }
00120 } else {
00121 if(phi==EmcID::getPHI_BARREL_MAX()) {
00122 aNb=EmcID::crystal_id(east_west,EmcID::getTHETA_ENDCAP_MAX(),
00123 EmcID::getPHI_ENDCAP_MIN());
00124 NeighborVec.push_back(aNb);
00125 } else {
00126 aNb=EmcID::crystal_id(east_west,EmcID::getTHETA_ENDCAP_MAX(),phi1+1);
00127 NeighborVec.push_back(aNb);
00128 }
00129 }
00130 }
00131
00132 else if((theta>EmcID::getTHETA_BARREL_MIN()) && (theta<EmcID::getTHETA_BARREL_MAX())) {
00133 aNb=EmcID::crystal_id(barrel_ec,theta+1,phip);
00134 NeighborVec.push_back(aNb);
00135 aNb=EmcID::crystal_id(barrel_ec,theta+1,phi);
00136 NeighborVec.push_back(aNb);
00137 aNb=EmcID::crystal_id(barrel_ec,theta+1,phin);
00138 NeighborVec.push_back(aNb);
00139 aNb=EmcID::crystal_id(barrel_ec,theta-1,phip);
00140 NeighborVec.push_back(aNb);
00141 aNb=EmcID::crystal_id(barrel_ec,theta-1,phi);
00142 NeighborVec.push_back(aNb);
00143 aNb=EmcID::crystal_id(barrel_ec,theta-1,phin);
00144 NeighborVec.push_back(aNb);
00145 }
00146 }
00147
00148 else if((barrel_ec==EmcID::getENDCAP_EAST()) ||
00149 (barrel_ec==EmcID::getENDCAP_WEST())) {
00150 unsigned int phiInSec=(EmcID::getPHI_ENDCAP_MAX(theta)+1)/16;
00151 unsigned int sector=phi/phiInSec;
00152 unsigned int phip=999;
00153 unsigned int phin=999;
00154 unsigned int InvalidPhi = 999;
00155 if(phi==EmcID::getPHI_ENDCAP_MIN()) {
00156 phip=EmcID::getPHI_ENDCAP_MAX(theta);
00157 phin=phi+1;
00158 }
00159 else if(phi==EmcID::getPHI_ENDCAP_MAX(theta)) {
00160 phip=phi-1;
00161 phin=EmcID::getPHI_ENDCAP_MIN();
00162 }
00163 else if((phi==4*phiInSec-1) || (phi==12*phiInSec-1)){
00164 phip=phi-1;
00165 phin=phi+1;
00166 }
00167 else if((phi==4*phiInSec) || (phi==12*phiInSec)) {
00168 phip=phi-1;
00169 phin=phi+1;
00170 }
00171 else if(((phi>EmcID::getPHI_ENDCAP_MIN())&&(phi<4*phiInSec-1)) ||
00172 ((phi>4*phiInSec)&&(phi<12*phiInSec-1)) ||
00173 ((phi>12*phiInSec)&&(phi<EmcID::getPHI_ENDCAP_MAX(theta)))) {
00174 phip=phi-1;
00175 phin=phi+1;
00176 }
00177
00178 if(phip!=InvalidPhi) {
00179 aNb=EmcID::crystal_id(barrel_ec,theta,phip);
00180 NeighborVec.push_back(aNb);
00181 }
00182 if(phin!=InvalidPhi) {
00183 aNb=EmcID::crystal_id(barrel_ec,theta,phin);
00184 NeighborVec.push_back(aNb);
00185 }
00186
00187 if(theta==EmcID::getTHETA_ENDCAP_MIN()) {
00188 if(phip!=InvalidPhi) {
00189 aNb=EmcID::crystal_id(barrel_ec,theta+1,phip);
00190 NeighborVec.push_back(aNb);
00191 }
00192 aNb=EmcID::crystal_id(barrel_ec,theta+1,phi);
00193 NeighborVec.push_back(aNb);
00194 if(phin!=InvalidPhi) {
00195 aNb=EmcID::crystal_id(barrel_ec,theta+1,phin);
00196 NeighborVec.push_back(aNb);
00197 }
00198 }
00199
00200 else if(theta==EmcID::getTHETA_ENDCAP_MAX()) {
00201 if(phip!=InvalidPhi) {
00202 aNb=EmcID::crystal_id(barrel_ec,theta-1,phip);
00203 NeighborVec.push_back(aNb);
00204 }
00205 aNb=EmcID::crystal_id(barrel_ec,theta-1,phi);
00206 NeighborVec.push_back(aNb);
00207 if(phin!=InvalidPhi) {
00208 aNb=EmcID::crystal_id(barrel_ec,theta-1,phin);
00209 NeighborVec.push_back(aNb);
00210 }
00211
00212 unsigned int phi1=phi*(EmcID::getPHI_BARREL_MAX()+1)/(EmcID::getPHI_ENDCAP_MAX(theta)+1);
00213 unsigned int min_max=0;
00214 if(barrel_ec==EmcID::getENDCAP_EAST()){
00215 min_max=EmcID::getTHETA_BARREL_MIN();
00216 } else {
00217 min_max=EmcID::getTHETA_BARREL_MAX();
00218 }
00219 aNb=EmcID::crystal_id(EmcID::getBARREL(),min_max,phi1);
00220 NeighborVec.push_back(aNb);
00221 aNb=EmcID::crystal_id(EmcID::getBARREL(),min_max,phi1+1);
00222 NeighborVec.push_back(aNb);
00223 if(phi%4==0) {
00224 if(phi==EmcID::getPHI_ENDCAP_MIN()) {
00225 aNb=EmcID::crystal_id(EmcID::getBARREL(),min_max,EmcID::getPHI_BARREL_MAX());
00226 NeighborVec.push_back(aNb);
00227 } else {
00228 aNb=EmcID::crystal_id(EmcID::getBARREL(),min_max,phi1-1);
00229 NeighborVec.push_back(aNb);
00230 }
00231 } else if(phi%4==3) {
00232 if(phi==EmcID::getPHI_ENDCAP_MAX(theta)){
00233 aNb=EmcID::crystal_id(EmcID::getBARREL(),min_max,EmcID::getPHI_BARREL_MIN());
00234 NeighborVec.push_back(aNb);
00235 } else {
00236 aNb=EmcID::crystal_id(EmcID::getBARREL(),min_max,phi1+2);
00237 NeighborVec.push_back(aNb);
00238 }
00239 }
00240 }
00241
00242 else if((theta==EmcID::getTHETA_ENDCAP_MIN()+1) ||
00243 (theta==EmcID::getTHETA_ENDCAP_MIN()+3)) {
00244 if(phip!=InvalidPhi) {
00245 aNb=EmcID::crystal_id(barrel_ec,theta-1,phip);
00246 NeighborVec.push_back(aNb);
00247 }
00248 aNb=EmcID::crystal_id(barrel_ec,theta-1,phi);
00249 NeighborVec.push_back(aNb);
00250 if(phin!=InvalidPhi) {
00251 aNb=EmcID::crystal_id(barrel_ec,theta-1,phin);
00252 NeighborVec.push_back(aNb);
00253 }
00254
00255 unsigned int phi1=phi*(phiInSec+1)/phiInSec;
00256 aNb=EmcID::crystal_id(barrel_ec,theta+1,phi1);
00257 NeighborVec.push_back(aNb);
00258 aNb=EmcID::crystal_id(barrel_ec,theta+1,phi1+1);
00259 NeighborVec.push_back(aNb);
00260 if(phi%phiInSec==0) {
00261 if(sector==0){
00262 aNb=EmcID::crystal_id(barrel_ec,theta+1,EmcID::getPHI_ENDCAP_MAX(theta+1));
00263 NeighborVec.push_back(aNb);
00264 } else {
00265 aNb=EmcID::crystal_id(barrel_ec,theta+1,phi1-1);
00266 NeighborVec.push_back(aNb);
00267 }
00268 } else if(phi%phiInSec==phiInSec-1) {
00269 if(sector==15){
00270 aNb=EmcID::crystal_id(barrel_ec,theta+1,EmcID::getPHI_ENDCAP_MIN());
00271 NeighborVec.push_back(aNb);
00272 } else {
00273 aNb=EmcID::crystal_id(barrel_ec,theta+1,phi1+2);
00274 NeighborVec.push_back(aNb);
00275 }
00276 }
00277 }
00278
00279 else if((theta==EmcID::getTHETA_ENDCAP_MIN()+2) ||
00280 (theta==EmcID::getTHETA_ENDCAP_MIN()+4)) {
00281 unsigned int phi1=phi*(phiInSec-1)/phiInSec;
00282 aNb=EmcID::crystal_id(barrel_ec,theta-1,phi1);
00283 NeighborVec.push_back(aNb);
00284 if(phi%phiInSec==0){
00285 if(sector==0){
00286 aNb=EmcID::crystal_id(barrel_ec,theta+1,EmcID::getPHI_ENDCAP_MAX(theta-1));
00287 NeighborVec.push_back(aNb);
00288 } else {
00289 aNb=EmcID::crystal_id(barrel_ec,theta-1,phi1-1);
00290 NeighborVec.push_back(aNb);
00291 }
00292 } else {
00293 if(phi==EmcID::getPHI_ENDCAP_MAX(theta)){
00294 aNb=EmcID::crystal_id(barrel_ec,theta-1,EmcID::getPHI_ENDCAP_MIN());
00295 NeighborVec.push_back(aNb);
00296 } else {
00297 aNb=EmcID::crystal_id(barrel_ec,theta-1,phi1+1);
00298 NeighborVec.push_back(aNb);
00299 }
00300 }
00301
00302 if(phip!=InvalidPhi) {
00303 aNb=EmcID::crystal_id(barrel_ec,theta+1,phip);
00304 NeighborVec.push_back(aNb);
00305 }
00306 aNb=EmcID::crystal_id(barrel_ec,theta+1,phi);
00307 NeighborVec.push_back(aNb);
00308 if(phin!=InvalidPhi) {
00309 aNb=EmcID::crystal_id(barrel_ec,theta+1,phin);
00310 NeighborVec.push_back(aNb);
00311 }
00312 }
00313 }
00314
00315 return NeighborVec;
00316 }
00317
00318
00319 RecEmcIDVector EmcRecNeighbor::GetNextNeighbors(const Identifier& id)
00320 {
00321 unsigned int barrel_ec=EmcID::barrel_ec(id);
00322 unsigned int theta=EmcID::theta_module(id);
00323 unsigned int phi=EmcID::phi_module(id);
00324
00325 RecEmcID aNb;
00326 RecEmcIDVector NeighborVec;
00327
00328 NeighborVec.clear();
00329
00330
00331 if(0) {
00332 unsigned int phip,phipp;
00333 unsigned int phin,phinn;
00334 unsigned int thetap,thetapp;
00335 unsigned int thetan,thetann;
00336 unsigned int invalidTheta=999999;
00337 if(phi==EmcID::getPHI_BARREL_MIN()) {
00338 phipp=EmcID::getPHI_BARREL_MAX()-1;
00339 phip=EmcID::getPHI_BARREL_MAX();
00340 phin=phi+1;
00341 phinn=phi+2;
00342 }
00343 if(phi==EmcID::getPHI_BARREL_MIN()+1) {
00344 phipp=EmcID::getPHI_BARREL_MAX();
00345 phip=phi-1;
00346 phin=phi+1;
00347 phinn=phi+2;
00348 }
00349 if(phi==EmcID::getPHI_BARREL_MAX()-1) {
00350 phipp=phi-2;
00351 phip=phi-1;
00352 phin=phi+1;
00353 phinn=EmcID::getPHI_BARREL_MIN();
00354 }
00355 if(phi==EmcID::getPHI_BARREL_MAX()) {
00356 phipp=phi-2;
00357 phip=phi-1;
00358 phin=EmcID::getPHI_BARREL_MIN();
00359 phinn=EmcID::getPHI_BARREL_MIN()+1;
00360 }
00361 if((phi>EmcID::getPHI_BARREL_MIN()+1) &&
00362 (phi<EmcID::getPHI_BARREL_MAX()-1)) {
00363 phipp=phi-2;
00364 phip=phi-1;
00365 phin=phi+1;
00366 phinn=phi+2;
00367 }
00368
00369 if(theta==EmcID::getTHETA_BARREL_MIN()) {
00370 thetapp=invalidTheta;
00371 thetap=invalidTheta;
00372 thetan=theta+1;
00373 thetann=theta+2;
00374 }
00375 if(theta==EmcID::getTHETA_BARREL_MIN()+1) {
00376 thetapp=invalidTheta;
00377 thetap=theta-1;
00378 thetan=theta+1;
00379 thetann=theta+2;
00380 }
00381 if((theta>EmcID::getTHETA_BARREL_MIN()+1) &&
00382 (theta<EmcID::getTHETA_BARREL_MAX()-1)) {
00383 thetapp=theta-2;
00384 thetap=theta-1;
00385 thetan=theta+1;
00386 thetann=theta+2;
00387 }
00388 if(theta==EmcID::getTHETA_BARREL_MAX()-1) {
00389 thetapp=theta-2;
00390 thetap=theta-1;
00391 thetan=theta+1;
00392 thetann=invalidTheta;
00393 }
00394 if(theta==EmcID::getTHETA_BARREL_MAX()) {
00395 thetapp=theta-2;
00396 thetap=theta-1;
00397 thetan=invalidTheta;
00398 thetann=invalidTheta;
00399 }
00400
00401
00402
00403
00404
00405 aNb=EmcID::crystal_id(barrel_ec,theta,phipp);
00406 NeighborVec.push_back(aNb);
00407 aNb=EmcID::crystal_id(barrel_ec,theta,phinn);
00408 NeighborVec.push_back(aNb);
00409
00410 if(thetapp!=invalidTheta) {
00411 aNb=EmcID::crystal_id(barrel_ec,thetapp,phipp);
00412 NeighborVec.push_back(aNb);
00413 aNb=EmcID::crystal_id(barrel_ec,thetapp,phip);
00414 NeighborVec.push_back(aNb);
00415 aNb=EmcID::crystal_id(barrel_ec,thetapp,phi);
00416 NeighborVec.push_back(aNb);
00417 aNb=EmcID::crystal_id(barrel_ec,thetapp,phin);
00418 NeighborVec.push_back(aNb);
00419 aNb=EmcID::crystal_id(barrel_ec,thetapp,phinn);
00420 NeighborVec.push_back(aNb);
00421 }
00422 if(thetap!=invalidTheta) {
00423 aNb=EmcID::crystal_id(barrel_ec,thetap,phipp);
00424 NeighborVec.push_back(aNb);
00425 aNb=EmcID::crystal_id(barrel_ec,thetap,phinn);
00426 NeighborVec.push_back(aNb);
00427 }
00428 if(thetan!=invalidTheta) {
00429 aNb=EmcID::crystal_id(barrel_ec,thetan,phipp);
00430 NeighborVec.push_back(aNb);
00431 aNb=EmcID::crystal_id(barrel_ec,thetan,phinn);
00432 NeighborVec.push_back(aNb);
00433 }
00434 if(thetann!=invalidTheta) {
00435 aNb=EmcID::crystal_id(barrel_ec,thetann,phipp);
00436 NeighborVec.push_back(aNb);
00437 aNb=EmcID::crystal_id(barrel_ec,thetann,phip);
00438 NeighborVec.push_back(aNb);
00439 aNb=EmcID::crystal_id(barrel_ec,thetann,phi);
00440 NeighborVec.push_back(aNb);
00441 aNb=EmcID::crystal_id(barrel_ec,thetann,phin);
00442 NeighborVec.push_back(aNb);
00443 aNb=EmcID::crystal_id(barrel_ec,thetann,phinn);
00444 NeighborVec.push_back(aNb);
00445 }
00446 }
00447
00448
00449
00450 else {
00451 RecEmcIDVector tmpNeighborVec,tmpNextNeighborVec;
00452 ci_RecEmcIDVector ci_NV,ci_tmpNV,ci_tmpNV1,ci_tmpNNV;
00453 tmpNeighborVec=GetNeighbors(id);
00454 bool flag=false;
00455 bool flagNeighbor=false;
00456
00457
00458 for(ci_tmpNV=tmpNeighborVec.begin();
00459 ci_tmpNV!=tmpNeighborVec.end();
00460 ci_tmpNV++){
00461 tmpNextNeighborVec=GetNeighbors(*ci_tmpNV);
00462
00463 for(ci_tmpNNV=tmpNextNeighborVec.begin();
00464 ci_tmpNNV!=tmpNextNeighborVec.end();
00465 ci_tmpNNV++){
00466
00467 for(ci_NV=NeighborVec.begin();
00468 ci_NV!=NeighborVec.end();
00469 ci_NV++){
00470 if(*ci_tmpNNV==*ci_NV){
00471 flag=true;
00472 continue;
00473 }
00474 }
00475
00476 if(!flag){
00477 for(ci_tmpNV1=tmpNeighborVec.begin();
00478 ci_tmpNV1!=tmpNeighborVec.end();
00479 ci_tmpNV1++){
00480 if(*ci_tmpNNV==*ci_tmpNV1){
00481 flagNeighbor=true;
00482 continue;
00483 }
00484 }
00485
00486 if(*ci_tmpNNV==id)
00487 flagNeighbor=true;
00488
00489 if(!flagNeighbor)
00490 NeighborVec.push_back(*ci_tmpNNV);
00491 else
00492 flagNeighbor=false;
00493 }
00494 else
00495 flag=false;
00496 }
00497
00498 }
00499
00500 }
00501
00502 return NeighborVec;
00503 }
00504