00001 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00002 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
00003 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00004
00005 #include "Calibration/IsolatedParticles/interface/MatrixECALDetIds.h"
00006 #include "Calibration/IsolatedParticles/interface/FindDistCone.h"
00007 #include "Calibration/IsolatedParticles/interface/DebugInfo.h"
00008
00009 #include <algorithm>
00010 #include <iostream>
00011
00012 namespace spr{
00013
00014 void matrixECALIds(const DetId& det, int ieta, int iphi,
00015 const CaloGeometry* geo, const CaloTopology* caloTopology,
00016 std::vector<DetId>& vdets, bool debug) {
00017
00018 const CaloSubdetectorTopology *barrelTopo = (caloTopology->getSubdetectorTopology(DetId::Ecal,EcalBarrel));
00019 const CaloSubdetectorTopology *endcapTopo = (caloTopology->getSubdetectorTopology(DetId::Ecal,EcalEndcap));
00020 const EcalBarrelGeometry *barrelGeom = (dynamic_cast< const EcalBarrelGeometry *> (geo->getSubdetectorGeometry(DetId::Ecal,EcalBarrel)));
00021 const EcalEndcapGeometry *endcapGeom = (dynamic_cast< const EcalEndcapGeometry *> (geo->getSubdetectorGeometry(DetId::Ecal,EcalEndcap)));
00022
00023 if (debug) {
00024 std::cout << "matrixECALIds::Add " << ieta << " rows and " << iphi
00025 << " columns of cells for 1 cell" << std::endl;
00026 spr::debugEcalDets(0, det, true);
00027 }
00028
00029 std::vector<DetId> dets(1,det);
00030 std::vector<CaloDirection> dirs(1,NORTH);
00031 vdets = spr::newECALIdNS(dets, 0, ieta,iphi, dirs, *barrelTopo,*endcapTopo,
00032 *barrelGeom,*endcapGeom,debug);
00033 dirs[0] = SOUTH;
00034 std::vector<DetId> vdetS = spr::newECALIdNS(dets, 0, ieta, iphi, dirs,
00035 *barrelTopo,*endcapTopo,
00036 *barrelGeom,*endcapGeom,debug);
00037 for (unsigned int i1=0; i1<vdetS.size(); i1++) {
00038 if (std::count(vdets.begin(),vdets.end(),vdetS[i1]) == 0)
00039 vdets.push_back(vdetS[i1]);
00040 }
00041 unsigned int ndet = (2*ieta+1)*(2*iphi+1);
00042 if (vdets.size() != ndet) {
00043 std::vector<DetId> vdetExtra;
00044 spr::extraIds(det, vdets, ieta, ieta, iphi, iphi,
00045 *barrelGeom, *endcapGeom, vdetExtra, debug);
00046 if (vdetExtra.size() > 0)
00047 vdets.insert(vdets.end(), vdetExtra.begin(), vdetExtra.end());
00048 }
00049
00050 if (debug) {
00051 std::cout << "matrixECALIds::Total number of cells found is "
00052 << vdets.size() << std::endl;
00053 spr::debugEcalDets(0, vdets);
00054 }
00055 }
00056
00057 std::vector<DetId> matrixECALIds(const DetId& det,int ieta,int iphi,
00058 const CaloGeometry* geo,
00059 const CaloTopology* caloTopology,
00060 bool debug) {
00061
00062 std::vector<DetId> vdets;
00063 spr::matrixECALIds(det, ieta, iphi, geo, caloTopology, vdets, debug);
00064 return vdets;
00065 }
00066
00067 std::vector<DetId> matrixECALIds(const DetId& det, double dR,
00068 const GlobalVector& trackMom,
00069 const CaloGeometry* geo,
00070 const CaloTopology* caloTopology,
00071 bool debug) {
00072
00073 GlobalPoint core;
00074 if (det.subdetId() == EcalEndcap) {
00075 EEDetId EEid = EEDetId(det);
00076 core = geo->getPosition(EEid);
00077 } else {
00078 EBDetId EBid = EBDetId(det);
00079 core = geo->getPosition(EBid);
00080 }
00081 int ietaphi = (int)(dR/2.0)+1;
00082 std::vector<DetId> vdets, vdetx;
00083 spr::matrixECALIds(det, ietaphi, ietaphi, geo, caloTopology, vdets, debug);
00084 for (unsigned int i=0; i<vdets.size(); ++i) {
00085 GlobalPoint rpoint;
00086 if (vdets[i].subdetId() == EcalEndcap) {
00087 EEDetId EEid = EEDetId(vdets[i]);
00088 rpoint = geo->getPosition(EEid);
00089 } else {
00090 EBDetId EBid = EBDetId(vdets[i]);
00091 rpoint = geo->getPosition(EBid);
00092 }
00093 if (spr::getDistInPlaneTrackDir(core, trackMom, rpoint)<dR) {
00094 vdetx.push_back(vdets[i]);
00095 }
00096 }
00097
00098 if (debug) {
00099 std::cout << "matrixECALIds::Final List of cells for dR " << dR
00100 << " is with " << vdetx.size() << " from original list of "
00101 << vdets.size() << std::endl;
00102 spr::debugEcalDets(0, vdetx);
00103 }
00104 return vdetx;
00105 }
00106
00107 void matrixECALIds(const DetId& det, int ietaE,int ietaW,int iphiN,int iphiS,
00108 const CaloGeometry* geo, const CaloTopology* caloTopology,
00109 std::vector<DetId>& vdets, bool debug) {
00110
00111 const CaloSubdetectorTopology *barrelTopo = (caloTopology->getSubdetectorTopology(DetId::Ecal,EcalBarrel));
00112 const CaloSubdetectorTopology *endcapTopo = (caloTopology->getSubdetectorTopology(DetId::Ecal,EcalEndcap));
00113 const EcalBarrelGeometry *barrelGeom = (dynamic_cast< const EcalBarrelGeometry *> (geo->getSubdetectorGeometry(DetId::Ecal,EcalBarrel)));
00114 const EcalEndcapGeometry *endcapGeom = (dynamic_cast< const EcalEndcapGeometry *> (geo->getSubdetectorGeometry(DetId::Ecal,EcalEndcap)));
00115
00116 if (debug) {
00117 std::cout << "matrixECALIds::Add " << ietaE << "|" << ietaW
00118 << " rows and " << iphiN << "|" << iphiS
00119 << " columns of cells for 1 cell" << std::endl;
00120 debugEcalDets(0, det, true);
00121 }
00122
00123 std::vector<DetId> dets(1,det);
00124 std::vector<CaloDirection> dirs(1,NORTH);
00125 std::vector<int> jetaE(1,ietaE), jetaW(1,ietaW);
00126 std::vector<int> jphiN(1,iphiN), jphiS(1,iphiS);
00127 vdets = spr::newECALIdNS(dets, 0, jetaE, jetaW, jphiN, jphiS, dirs,
00128 *barrelTopo, *endcapTopo, *barrelGeom,
00129 *endcapGeom, debug);
00130 dirs[0] = SOUTH;
00131 std::vector<DetId> vdetS = spr::newECALIdNS(dets, 0, jetaE, jetaW, jphiN,
00132 jphiS, dirs, *barrelTopo,
00133 *endcapTopo, *barrelGeom,
00134 *endcapGeom, debug);
00135 for (unsigned int i1=0; i1<vdetS.size(); i1++) {
00136 if (std::count(vdets.begin(),vdets.end(),vdetS[i1]) == 0)
00137 vdets.push_back(vdetS[i1]);
00138 }
00139
00140 unsigned int ndet = (ietaE+ietaW+1)*(iphiN+iphiS+1);
00141 if (vdets.size() != ndet) {
00142 std::vector<DetId> vdetExtra;
00143 spr::extraIds(det, vdets, ietaE, ietaW, iphiN, iphiS,
00144 *barrelGeom, *endcapGeom, vdetExtra, debug);
00145 if (vdetExtra.size() > 0)
00146 vdets.insert(vdets.end(), vdetExtra.begin(), vdetExtra.end());
00147 }
00148
00149 if (debug) {
00150 std::cout << "matrixECALIds::Total number of cells found is "
00151 << vdets.size() << std::endl;
00152 spr::debugEcalDets(0, vdets);
00153 }
00154 }
00155
00156 std::vector<DetId> matrixECALIds(const DetId& det, int ietaE, int ietaW,
00157 int iphiN, int iphiS,
00158 const CaloGeometry* geo,
00159 const CaloTopology* caloTopology,
00160 bool debug) {
00161
00162 std::vector<DetId> vdets;
00163 spr::matrixECALIds(det, ietaE, ietaW, iphiN, iphiS, geo, caloTopology,
00164 vdets, debug);
00165 return vdets;
00166 }
00167
00168 std::vector<DetId> newECALIdNS(std::vector<DetId>& dets, unsigned int last,
00169 int ieta, int iphi,
00170 std::vector<CaloDirection>& dir,
00171 const CaloSubdetectorTopology& barrelTopo,
00172 const CaloSubdetectorTopology& endcapTopo,
00173 const EcalBarrelGeometry& barrelGeom,
00174 const EcalEndcapGeometry& endcapGeom,
00175 bool debug) {
00176
00177 if (debug) {
00178 std::cout << "newECALIdNS::Add " << iphi << " columns of cells for "
00179 << (dets.size()-last) << " cells (last " << last << ")"
00180 << std::endl;
00181 spr::debugEcalDets(last, dets, dir);
00182 }
00183
00184 std::vector<DetId> vdets;
00185 std::vector<CaloDirection> dirs;
00186 vdets.insert(vdets.end(), dets.begin(), dets.end());
00187 dirs.insert(dirs.end(), dir.begin(), dir.end());
00188
00189 std::vector<DetId> vdetE, vdetW;
00190 if (last == 0) {
00191 unsigned int ndet = vdets.size();
00192 std::vector<CaloDirection> dirE(ndet,EAST), dirW(ndet,WEST);
00193 vdetE = spr::newECALIdEW(dets, last, ieta, dirE, barrelTopo, endcapTopo,
00194 barrelGeom, endcapGeom, debug);
00195 vdetW = spr::newECALIdEW(dets, last, ieta, dirW, barrelTopo, endcapTopo,
00196 barrelGeom, endcapGeom, debug);
00197 for (unsigned int i1=0; i1<vdetW.size(); i1++) {
00198 if (std::count(vdets.begin(),vdets.end(),vdetW[i1]) == 0) {
00199 vdets.push_back(vdetW[i1]);
00200 dirs.push_back(dir[0]);
00201 }
00202 }
00203 for (unsigned int i1=0; i1<vdetE.size(); i1++) {
00204 if (std::count(vdets.begin(),vdets.end(),vdetE[i1]) == 0) {
00205 vdets.push_back(vdetE[i1]);
00206 dirs.push_back(dir[0]);
00207 }
00208 }
00209 if (debug) {
00210 std::cout <<"newECALIdNS::With Added cells along E/W results a set of "
00211 << (vdets.size()-dets.size()) << " new cells" << std::endl;
00212 spr::debugEcalDets(dets.size(), vdets, dirs);
00213 }
00214 }
00215
00216 unsigned int last0 = vdets.size();
00217 std::vector<DetId> vdetnew;
00218 std::vector<CaloDirection> dirnew;
00219 if (iphi > 0) {
00220 std::vector<DetId> vdetn(1);
00221 std::vector<CaloDirection> dirn(1);
00222 std::vector<CaloDirection> dirnE(1,EAST), dirnW(1,WEST);
00223 int flag=0;
00224 for (unsigned int i1=last; i1<dets.size(); i1++) {
00225 std::vector<DetId> cells;
00226 spr::simpleMove(dets[i1], dir[i1], barrelTopo, endcapTopo,
00227 barrelGeom, endcapGeom, cells, flag, debug);
00228 if (flag != 0) {
00229 if (std::count(vdets.begin(),vdets.end(),cells[0]) == 0) {
00230 vdetn[0] = cells[0];
00231 vdetnew.push_back(vdetn[0]);
00232 dirn[0] = dir[i1];
00233 if (flag < 0) {
00234 if (dirn[0] == NORTH) dirn[0] = SOUTH;
00235 else dirn[0] = NORTH;
00236 }
00237 dirnew.push_back(dirn[0]);
00238 vdetE = spr::newECALIdEW(vdetn, 0, ieta, dirnE, barrelTopo,
00239 endcapTopo, barrelGeom, endcapGeom,debug);
00240 vdetW = spr::newECALIdEW(vdetn, 0, ieta, dirnW, barrelTopo,
00241 endcapTopo, barrelGeom, endcapGeom,debug);
00242 for (unsigned int i2=0; i2<vdetW.size(); i2++) {
00243 if (std::count(vdets.begin(),vdets.end(),vdetW[i2]) == 0 &&
00244 std::count(vdetnew.begin(),vdetnew.end(),vdetW[i2]) == 0) {
00245 vdets.push_back(vdetW[i2]);
00246 dirs.push_back(dirn[0]);
00247 }
00248 }
00249 for (unsigned int i2=0; i2<vdetE.size(); i2++) {
00250 if (std::count(vdets.begin(),vdets.end(),vdetE[i2]) == 0 &&
00251 std::count(vdetnew.begin(),vdetnew.end(),vdetE[i2]) == 0) {
00252 vdets.push_back(vdetE[i2]);
00253 dirs.push_back(dirn[0]);
00254 }
00255 }
00256 }
00257 }
00258 }
00259 iphi--;
00260 last = vdets.size();
00261 for (unsigned int i2=0; i2<vdetnew.size(); i2++) {
00262 if (std::count(vdets.begin(),vdets.end(),vdetnew[i2]) == 0) {
00263 vdets.push_back(vdetnew[i2]);
00264 dirs.push_back(dirnew[i2]);
00265 }
00266 }
00267 if (debug) {
00268 std::cout << "newECALIdNS::Addition results a set of "
00269 << (vdets.size()-last0) << " new cells (last " << last0
00270 << ", iphi " << iphi << ")" << std::endl;
00271 spr::debugEcalDets(last0, vdets, dirs);
00272 }
00273 last0 = last;
00274 }
00275
00276 if (iphi > 0) {
00277 last = last0;
00278 return spr::newECALIdNS(vdets,last,ieta,iphi,dirs,barrelTopo,endcapTopo,barrelGeom,endcapGeom,debug);
00279 } else {
00280 if (debug) {
00281 std::cout << "newECALIdNS::Final list consists of " << vdets.size()
00282 << " cells" << std::endl;
00283 spr::debugEcalDets(0, vdets);
00284 }
00285 return vdets;
00286 }
00287 }
00288
00289 std::vector<DetId> newECALIdNS(std::vector<DetId>& dets, unsigned int last,
00290 std::vector<int>& ietaE,
00291 std::vector<int>& ietaW,
00292 std::vector<int>& iphiN,
00293 std::vector<int>& iphiS,
00294 std::vector<CaloDirection>& dir,
00295 const CaloSubdetectorTopology& barrelTopo,
00296 const CaloSubdetectorTopology& endcapTopo,
00297 const EcalBarrelGeometry& barrelGeom,
00298 const EcalEndcapGeometry& endcapGeom,
00299 bool debug) {
00300
00301 if (debug) {
00302 std::cout << "newECALIdNS::Add columns of cells for "
00303 << (dets.size()-last) << " cells (last) " << last << std::endl;
00304 for (unsigned int i1=last; i1<dets.size(); i1++) {
00305 spr::debugEcalDets (i1, dets[i1], false);
00306 std::cout << " along " << dir[i1] << " # " << iphiN[i1] << "|"
00307 << iphiS[i1] << std::endl;
00308 }
00309 }
00310
00311 std::vector<DetId> vdets;
00312 std::vector<CaloDirection> dirs;
00313 std::vector<int> jetaE, jetaW, jphiN, jphiS;
00314 vdets.insert(vdets.end(), dets.begin(), dets.end());
00315 dirs.insert(dirs.end(), dir.begin(), dir.end());
00316 jetaE.insert(jetaE.end(), ietaE.begin(), ietaE.end());
00317 jetaW.insert(jetaW.end(), ietaW.begin(), ietaW.end());
00318 jphiN.insert(jphiN.end(), iphiN.begin(), iphiN.end());
00319 jphiS.insert(jphiS.end(), iphiS.begin(), iphiS.end());
00320 std::vector<DetId> vdetE, vdetW;
00321 if (last == 0) {
00322 unsigned int ndet = vdets.size();
00323 std::vector<CaloDirection> dirE(ndet,EAST), dirW(ndet,WEST);
00324 vdetE = spr::newECALIdEW(dets, last, ietaE, ietaW, dirE, barrelTopo,
00325 endcapTopo, barrelGeom, endcapGeom, debug);
00326 vdetW = spr::newECALIdEW(dets, last, ietaE, ietaW, dirW, barrelTopo,
00327 endcapTopo, barrelGeom, endcapGeom, debug);
00328 for (unsigned int i1=0; i1<vdetW.size(); i1++) {
00329 if (std::count(vdets.begin(),vdets.end(),vdetW[i1]) == 0) {
00330 vdets.push_back(vdetW[i1]);
00331 dirs.push_back(dir[0]);
00332 jetaE.push_back(0);
00333 jetaW.push_back(0);
00334 jphiN.push_back(iphiN[0]);
00335 jphiS.push_back(iphiS[0]);
00336 }
00337 }
00338 for (unsigned int i1=0; i1<vdetE.size(); i1++) {
00339 if (std::count(vdets.begin(),vdets.end(),vdetE[i1]) == 0) {
00340 vdets.push_back(vdetE[i1]);
00341 dirs.push_back(dir[0]);
00342 jetaE.push_back(0);
00343 jetaW.push_back(0);
00344 jphiN.push_back(iphiN[0]);
00345 jphiS.push_back(iphiS[0]);
00346 }
00347 }
00348 if (debug) {
00349 std::cout <<"newECALIdNS::With Added cells along E/W results a set of "
00350 << (vdets.size()-dets.size()) << " new cells" << std::endl;
00351 spr::debugEcalDets(dets.size(), vdets, dirs);
00352 }
00353 }
00354
00355 unsigned int last0 = vdets.size();
00356 std::vector<DetId> vdetnew;
00357 std::vector<CaloDirection> dirnew;
00358 std::vector<int> kphiN, kphiS, ketaE, ketaW;
00359 int kphi = 0;
00360 for (unsigned int i1=last; i1<dets.size(); i1++) {
00361 int iphi = iphiS[i1];
00362 if (dir[i1] == NORTH) iphi = iphiN[i1];
00363 if (iphi > 0) {
00364 std::vector<DetId> vdetn(1);
00365 std::vector<CaloDirection> dirn(1);
00366 std::vector<CaloDirection> dirnE(1,EAST), dirnW(1,WEST);
00367 int flag=0;
00368 std::vector<DetId> cells;
00369 spr::simpleMove(dets[i1], dir[i1], barrelTopo, endcapTopo,
00370 barrelGeom, endcapGeom, cells, flag, debug);
00371 iphi--;
00372 if (iphi > kphi) kphi = iphi;
00373 if (dir[i1] == NORTH) jphiN[i1] = iphi;
00374 else jphiS[i1] = iphi;
00375 if (flag != 0) {
00376 if (std::count(vdets.begin(),vdets.end(),cells[0]) == 0) {
00377 int kfiN = iphiN[i1];
00378 int kfiS = iphiS[i1];
00379 vdetn[0] = cells[0];
00380 vdetnew.push_back(vdetn[0]);
00381 dirn[0] = dir[i1];
00382 if (dir[i1] == NORTH) kfiN = iphi;
00383 else kfiS = iphi;
00384 if (flag < 0) {
00385 int ktmp = kfiS; kfiS = kfiN; kfiN = ktmp;
00386 if (dirn[0] == NORTH) dirn[0] = SOUTH;
00387 else dirn[0] = NORTH;
00388 }
00389 dirnew.push_back(dirn[0]);
00390 kphiN.push_back(kfiN); ketaE.push_back(ietaE[i1]);
00391 kphiS.push_back(kfiS); ketaW.push_back(ietaW[i1]);
00392 std::vector<int> ietE(1,ietaE[i1]), ietW(1,ietaW[i1]);
00393 vdetE = spr::newECALIdEW(vdetn, 0, ietE, ietW, dirnE, barrelTopo,
00394 endcapTopo, barrelGeom, endcapGeom,debug);
00395 vdetW = spr::newECALIdEW(vdetn, 0, ietE, ietW, dirnW, barrelTopo,
00396 endcapTopo, barrelGeom, endcapGeom,debug);
00397 for (unsigned int i2=0; i2<vdetW.size(); i2++) {
00398 if (std::count(vdets.begin(),vdets.end(),vdetW[i2]) == 0 &&
00399 std::count(vdetnew.begin(),vdetnew.end(),vdetW[i2]) == 0) {
00400 vdets.push_back(vdetW[i2]);
00401 dirs.push_back(dirn[0]);
00402 jetaE.push_back(0); jphiN.push_back(kfiN);
00403 jetaW.push_back(0); jphiS.push_back(kfiS);
00404 }
00405 }
00406 for (unsigned int i2=0; i2<vdetE.size(); i2++) {
00407 if (std::count(vdets.begin(),vdets.end(),vdetE[i2]) == 0 &&
00408 std::count(vdetnew.begin(),vdetnew.end(),vdetE[i2]) == 0) {
00409 vdets.push_back(vdetE[i2]);
00410 dirs.push_back(dirn[0]);
00411 jetaE.push_back(0); jphiN.push_back(kfiN);
00412 jetaW.push_back(0); jphiS.push_back(kfiS);
00413 }
00414 }
00415 }
00416 }
00417 }
00418 }
00419 last = vdets.size();
00420 for (unsigned int i2=0; i2<vdetnew.size(); i2++) {
00421 if (std::count(vdets.begin(),vdets.end(),vdetnew[i2]) == 0) {
00422 vdets.push_back(vdetnew[i2]);
00423 dirs.push_back(dirnew[i2]);
00424 jetaE.push_back(ketaE[i2]);
00425 jetaW.push_back(ketaW[i2]);
00426 jphiN.push_back(kphiN[i2]);
00427 jphiS.push_back(kphiS[i2]);
00428 }
00429 }
00430 if (debug) {
00431 std::cout << "newECALIdNS::Addition results a set of "
00432 << (vdets.size()-last0) << " new cells (last " << last0
00433 << ", iphi " << kphi << ")" << std::endl;
00434 for (unsigned int i1=last0; i1<vdets.size(); i1++) {
00435 spr::debugEcalDets (i1, vdets[i1], false);
00436 std::cout << " along " << dirs[i1] << " iphi " << jphiN[i1] << "|"
00437 << jphiS[i1] << " ieta " << jetaE[i1] << "|" << jetaW[i1]
00438 << std::endl;
00439 }
00440 }
00441 last0 = last;
00442
00443 if (kphi > 0) {
00444 last = last0;
00445 return spr::newECALIdNS(vdets, last, jetaE, jetaW, jphiN, jphiS, dirs,
00446 barrelTopo, endcapTopo, barrelGeom, endcapGeom,
00447 debug);
00448 } else {
00449 if (debug) {
00450 std::cout << "newECALIdNS::Final list consists of " << vdets.size()
00451 << " cells" << std::endl;
00452 spr::debugEcalDets (0, vdets);
00453 }
00454 return vdets;
00455 }
00456 }
00457
00458 std::vector<DetId> newECALIdEW(std::vector<DetId>& dets, unsigned int last,
00459 int ieta, std::vector<CaloDirection>& dir,
00460 const CaloSubdetectorTopology& barrelTopo,
00461 const CaloSubdetectorTopology& endcapTopo,
00462 const EcalBarrelGeometry& barrelGeom,
00463 const EcalEndcapGeometry& endcapGeom,
00464 bool debug) {
00465
00466 if (debug) {
00467 std::cout << "newECALIdEW::Add " << ieta << " rows of cells for "
00468 << last << ":" << dets.size() << ":" << (dets.size()-last)
00469 << " cells" << std::endl;
00470 spr::debugEcalDets (last, dets, dir);
00471 }
00472
00473 std::vector<DetId> vdets; vdets.clear();
00474 std::vector<CaloDirection> dirs; dirs.clear();
00475 vdets.insert(vdets.end(), dets.begin(), dets.end());
00476 dirs.insert(dirs.end(), dir.begin(), dir.end());
00477
00478 if (ieta > 0) {
00479 for (unsigned int i1=last; i1<dets.size(); i1++) {
00480 int flag = 0;
00481 std::vector<DetId> cells;
00482 spr::simpleMove(dets[i1], dir[i1], barrelTopo, endcapTopo,
00483 barrelGeom, endcapGeom, cells, flag, debug);
00484 if (flag != 0) {
00485 if (std::count(vdets.begin(),vdets.end(),cells[0]) == 0) {
00486 CaloDirection dirn = dir[i1];
00487 if (flag < 0) {
00488 if (dirn == EAST) dirn = WEST;
00489 else dirn = EAST;
00490 }
00491 vdets.push_back(cells[0]);
00492 dirs.push_back(dirn);
00493 }
00494 }
00495 }
00496 ieta--;
00497 }
00498
00499 if (debug) {
00500 std::cout << "newECALIdEW::Addition results a set of "
00501 << (vdets.size()-dets.size()) << " new cells" << std::endl;
00502 spr::debugEcalDets (dets.size(), vdets, dirs);
00503 }
00504
00505 if (ieta > 0) {
00506 last = dets.size();
00507 return spr::newECALIdEW(vdets,last,ieta,dirs,barrelTopo,endcapTopo,barrelGeom,endcapGeom,debug);
00508 } else {
00509 if (debug) {
00510 std::cout << "newECALIdEW::Final list (EW) consists of " <<vdets.size()
00511 << " cells" << std::endl;
00512 spr::debugEcalDets (0, vdets);
00513 }
00514 return vdets;
00515 }
00516 }
00517
00518 std::vector<DetId> newECALIdEW(std::vector<DetId>& dets, unsigned int last,
00519 std::vector<int>& ietaE,
00520 std::vector<int>& ietaW,
00521 std::vector<CaloDirection>& dir,
00522 const CaloSubdetectorTopology& barrelTopo,
00523 const CaloSubdetectorTopology& endcapTopo,
00524 const EcalBarrelGeometry& barrelGeom,
00525 const EcalEndcapGeometry& endcapGeom,
00526 bool debug) {
00527
00528 if (debug) {
00529 std::cout << "newECALIdEW::Add " << ietaE[0] << "|" << ietaW[0]
00530 << " rows of cells for " << (dets.size()-last)
00531 << " cells (last " << last << ")" << std::endl;
00532 spr::debugEcalDets (last, dets, dir);
00533 }
00534
00535 std::vector<DetId> vdets;
00536 vdets.insert(vdets.end(), dets.begin(), dets.end());
00537 std::vector<CaloDirection> dirs;
00538 dirs.insert(dirs.end(), dir.begin(), dir.end());
00539 std::vector<int> jetaE, jetaW;
00540 jetaE.insert(jetaE.end(), ietaE.begin(), ietaE.end());
00541 jetaW.insert(jetaW.end(), ietaW.begin(), ietaW.end());
00542 int keta = 0;
00543 for (unsigned int i1=last; i1<dets.size(); i1++) {
00544 int ieta = ietaW[i1];
00545 if (dir[i1] == EAST) ieta = ietaE[i1];
00546 if (ieta > 0) {
00547 int flag=0;
00548 std::vector<DetId> cells;
00549 spr::simpleMove(dets[i1], dir[i1], barrelTopo, endcapTopo,
00550 barrelGeom, endcapGeom, cells, flag, debug);
00551 ieta--;
00552 if (ieta > keta) keta = ieta;
00553 if (dir[i1] == EAST) jetaE[i1] = ieta;
00554 else jetaW[i1] = ieta;
00555 if (flag != 0) {
00556 if (std::count(vdets.begin(),vdets.end(),cells[0]) == 0) {
00557 vdets.push_back(cells[0]);
00558 CaloDirection dirn = dir[i1];
00559 int ketaE = ietaE[i1];
00560 int ketaW = ietaW[i1];
00561 if (dirn == EAST) ketaE = ieta;
00562 else ketaW = ieta;
00563 if (flag < 0) {
00564 int ktmp = ketaW; ketaW = ketaE; ketaE = ktmp;
00565 if (dirn == EAST) dirn = WEST;
00566 else dirn = EAST;
00567 }
00568 dirs.push_back(dirn);
00569 jetaE.push_back(ketaE);
00570 jetaW.push_back(ketaW);
00571 }
00572 }
00573 }
00574 }
00575
00576 if (debug) {
00577 std::cout << "newECALIdEW::Addition results a set of "
00578 << (vdets.size()-dets.size()) << " new cells (last "
00579 << dets.size() << ", ieta " << keta << ")" << std::endl;
00580 spr::debugEcalDets (dets.size(), vdets);
00581 }
00582
00583 if (keta > 0) {
00584 last = dets.size();
00585 return spr::newECALIdEW(vdets, last, jetaE, jetaW, dirs, barrelTopo,
00586 endcapTopo, barrelGeom, endcapGeom, debug);
00587 } else {
00588 if (debug) {
00589 std::cout << "newECALIdEW::Final list (EW) consists of " <<vdets.size()
00590 << " cells" << std::endl;
00591 spr::debugEcalDets (0, vdets);
00592 }
00593 return vdets;
00594 }
00595 }
00596
00597 void simpleMove(DetId& det, const CaloDirection& dir,
00598 const CaloSubdetectorTopology& barrelTopo,
00599 const CaloSubdetectorTopology& endcapTopo,
00600 const EcalBarrelGeometry& barrelGeom,
00601 const EcalEndcapGeometry& endcapGeom,
00602 std::vector<DetId>& cells, int& ok, bool debug) {
00603
00604 DetId cell;
00605 ok = 0;
00606 if (det.subdetId() == EcalBarrel) {
00607 EBDetId detId = det;
00608 std::vector<DetId> neighbours = barrelTopo.getNeighbours(detId,dir);
00609 if (neighbours.size()>0 && !neighbours[0].null()) {
00610 cells.push_back(neighbours[0]);
00611 cell = neighbours[0];
00612 ok = 1;
00613 } else {
00614 const int ietaAbs ( detId.ietaAbs() ) ;
00615 if (EBDetId::MAX_IETA == ietaAbs ) {
00616
00617 const EcalBarrelGeometry::OrderedListOfEEDetId&
00618 ol( * barrelGeom.getClosestEndcapCells(detId) ) ;
00619
00620 cell = *(ol.begin() );
00621 neighbours = endcapTopo.getNeighbours(cell,dir);
00622 if (neighbours.size()>0 && !neighbours[0].null()) ok = 1;
00623 else ok =-1;
00624 for (EcalBarrelGeometry::OrderedListOfEEDetId::const_iterator iptr=ol.begin(); iptr != ol.end(); ++iptr)
00625 cells.push_back(*iptr);
00626 }
00627 }
00628 } else if (det.subdetId() == EcalEndcap) {
00629 EEDetId detId = det;
00630 std::vector<DetId> neighbours = endcapTopo.getNeighbours(detId,dir);
00631 if (neighbours.size()>0 && !neighbours[0].null()) {
00632 cells.push_back(neighbours[0]);
00633 cell = neighbours[0];
00634 ok = 1;
00635 } else {
00636
00637 const int iphi ( detId.iPhiOuterRing() ) ;
00638 if (iphi!= 0) {
00639
00640 const EcalEndcapGeometry::OrderedListOfEBDetId&
00641 ol( * endcapGeom.getClosestBarrelCells(detId) ) ;
00642
00643 cell = *(ol.begin() );
00644 neighbours = barrelTopo.getNeighbours(cell,dir);
00645 if (neighbours.size()>0 && !neighbours[0].null()) ok = 1;
00646 else ok =-1;
00647 for (EcalEndcapGeometry::OrderedListOfEBDetId::const_iterator iptr=ol.begin(); iptr != ol.end(); ++iptr)
00648 cells.push_back(*iptr);
00649 }
00650 }
00651 }
00652 if (debug) {
00653 std::cout << "simpleMove:: Move DetId 0x" << std::hex << det()
00654 << std::dec << " along " << dir << " to get 0x" << std::hex
00655 << cell() << std::dec << " with flag " << ok << " # "
00656 << cells.size();
00657 for (unsigned int i1=0; i1<cells.size(); ++i1)
00658 std::cout << " " << std::hex << cells[0]() << std::dec;
00659 std::cout << std::endl;
00660 }
00661 }
00662
00663 void extraIds(const DetId& det, std::vector<DetId>& dets, int ietaE, int ietaW, int iphiN, int iphiS, const EcalBarrelGeometry& barrelGeom, const EcalEndcapGeometry& endcapGeom, std::vector<DetId>& cells, bool debug) {
00664
00665 if (det.subdetId() == EcalBarrel) {
00666 EBDetId id = det;
00667 if (debug) std::cout << "extraIds::Cell " << id << " rows " << ietaW
00668 << "|" << ietaE << " columns " << iphiS << "|"
00669 << iphiN << std::endl;
00670 int etaC = id.ietaAbs();
00671 int phiC = id.iphi();
00672 int zsid = id.zside();
00673 for (int eta = -ietaW; eta <= ietaE; ++eta) {
00674 for (int phi = -iphiS; phi <= iphiN; ++phi) {
00675 int iphi = phiC+phi;
00676 if (iphi < 0) iphi += 360;
00677 else if (iphi > 360) iphi -= 360;
00678 int ieta = zsid*(etaC+eta);
00679 if (EBDetId::validDetId(ieta,iphi)) {
00680 id = EBDetId(ieta,iphi);
00681 if (barrelGeom.present(id)) {
00682 if (std::count(dets.begin(),dets.end(),(DetId)id) == 0) {
00683 cells.push_back((DetId)id);
00684 }
00685 }
00686 }
00687 }
00688 }
00689 } else if (det.subdetId() == EcalEndcap) {
00690 EEDetId id = det;
00691 if (debug) std::cout << "extraIds::Cell " << id << " rows " << ietaW
00692 << "|" << ietaE << " columns " << iphiS << "|"
00693 << iphiN << std::endl;
00694 int ixC = id.ix();
00695 int iyC = id.iy();
00696 int zsid = id.zside();
00697 for (int kx = -ietaW; kx <= ietaE; ++kx) {
00698 for (int ky = -iphiS; ky <= iphiN; ++ky) {
00699 int ix = ixC+kx;
00700 int iy = iyC+ky;
00701 if (EEDetId::validDetId(ix,iy,zsid)) {
00702 id = EEDetId(ix,iy,zsid);
00703 if (endcapGeom.present(id)) {
00704 if (std::count(dets.begin(),dets.end(),(DetId)id) == 0) {
00705 cells.push_back((DetId)id);
00706 }
00707 }
00708 }
00709 }
00710 }
00711 }
00712
00713 if (debug) {
00714 std::cout << "extraIds:: finds " << cells.size() << " new cells"
00715 << std::endl;
00716 spr::debugEcalDets (0, cells);
00717 }
00718 }
00719 }