Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
#include "Calibration/IsolatedParticles/interface/CaloConstants.h"
#include "Calibration/IsolatedParticles/interface/FindCaloHitCone.h"
#include "Calibration/IsolatedParticles/interface/FindDistCone.h"
#include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
#include "Geometry/HcalTowerAlgo/interface/HcalGeometry.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include <iostream>

namespace spr {

  //Ecal Endcap OR Barrel RecHits
  std::vector<EcalRecHitCollection::const_iterator> findCone(const CaloGeometry* geo,
                                                             edm::Handle<EcalRecHitCollection>& hits,
                                                             const GlobalPoint& hpoint1,
                                                             const GlobalPoint& point1,
                                                             double dR,
                                                             const GlobalVector& trackMom,
                                                             bool debug) {
    std::vector<EcalRecHitCollection::const_iterator> hit;

    for (EcalRecHitCollection::const_iterator j = hits->begin(); j != hits->end(); j++) {
      bool keepHit = false;

      if (j->id().subdetId() == EcalEndcap) {
        EEDetId EEid = EEDetId(j->id());
        const GlobalPoint& rechitPoint = geo->getPosition(EEid);
        if (spr::getDistInPlaneTrackDir(point1, trackMom, rechitPoint, debug) < dR)
          keepHit = true;
      } else if (j->id().subdetId() == EcalBarrel) {
        EBDetId EBid = EBDetId(j->id());
        const GlobalPoint& rechitPoint = geo->getPosition(EBid);
        if (spr::getDistInPlaneTrackDir(point1, trackMom, rechitPoint, debug) < dR)
          keepHit = true;
      }

      if (keepHit)
        hit.push_back(j);
    }
    return hit;
  }

  // Ecal Endcap AND Barrel RecHits
  std::vector<EcalRecHitCollection::const_iterator> findCone(const CaloGeometry* geo,
                                                             edm::Handle<EcalRecHitCollection>& barrelhits,
                                                             edm::Handle<EcalRecHitCollection>& endcaphits,
                                                             const GlobalPoint& hpoint1,
                                                             const GlobalPoint& point1,
                                                             double dR,
                                                             const GlobalVector& trackMom,
                                                             bool debug) {
    std::vector<EcalRecHitCollection::const_iterator> hit;

    // Only check both barrel and endcap when track is near transition
    // region: 1.479-2*0.087 < trkEta < 1.479+2*0.087

    bool doBarrel = false, doEndcap = false;
    if (std::abs(point1.eta()) < (spr::etaBEEcal + 2 * spr::deltaEta))
      doBarrel = true;  // 1.479+2*0.087
    if (std::abs(point1.eta()) > (spr::etaBEEcal - 2 * spr::deltaEta))
      doEndcap = true;  // 1.479-2*0.087

    if (doBarrel) {
      for (EcalRecHitCollection::const_iterator j = barrelhits->begin(); j != barrelhits->end(); j++) {
        bool keepHit = false;
        if (j->id().subdetId() == EcalBarrel) {
          EBDetId EBid = EBDetId(j->id());
          const GlobalPoint& rechitPoint = geo->getPosition(EBid);
          if (spr::getDistInPlaneTrackDir(point1, trackMom, rechitPoint, debug) < dR)
            keepHit = true;
        } else {
          edm::LogWarning("IsoTrack") << "PROBLEM : Endcap RecHits in Barrel Collection!?";
        }
        if (keepHit)
          hit.push_back(j);
      }
    }  // doBarrel

    if (doEndcap) {
      for (EcalRecHitCollection::const_iterator j = endcaphits->begin(); j != endcaphits->end(); j++) {
        bool keepHit = false;

        if (j->id().subdetId() == EcalEndcap) {
          EEDetId EEid = EEDetId(j->id());
          const GlobalPoint& rechitPoint = geo->getPosition(EEid);
          if (spr::getDistInPlaneTrackDir(point1, trackMom, rechitPoint, debug) < dR)
            keepHit = true;
        } else {
          edm::LogWarning("IsoTrack") << "PROBLEM : Barrel RecHits in Endcap Collection!?";
        }
        if (keepHit)
          hit.push_back(j);
      }
    }  // doEndcap

    return hit;
  }

  //HBHE RecHits
  std::vector<HBHERecHitCollection::const_iterator> findCone(const CaloGeometry* geo,
                                                             edm::Handle<HBHERecHitCollection>& hits,
                                                             const GlobalPoint& hpoint1,
                                                             const GlobalPoint& point1,
                                                             double dR,
                                                             const GlobalVector& trackMom,
                                                             bool debug) {
    std::vector<HBHERecHitCollection::const_iterator> hit;
    // Loop over Hcal RecHits
    for (HBHERecHitCollection::const_iterator j = hits->begin(); j != hits->end(); j++) {
      DetId detId(j->id());
      const GlobalPoint rechitPoint =
          (static_cast<const HcalGeometry*>(geo->getSubdetectorGeometry(detId)))->getPosition(detId);
      if (spr::getDistInPlaneTrackDir(hpoint1, trackMom, rechitPoint, debug) < dR)
        hit.push_back(j);
    }
    return hit;
  }

  // PCalo SimHits
  std::vector<edm::PCaloHitContainer::const_iterator> findCone(const CaloGeometry* geo,
                                                               edm::Handle<edm::PCaloHitContainer>& hits,
                                                               const GlobalPoint& hpoint1,
                                                               const GlobalPoint& point1,
                                                               double dR,
                                                               const GlobalVector& trackMom,
                                                               bool debug) {
    std::vector<edm::PCaloHitContainer::const_iterator> hit;
    edm::PCaloHitContainer::const_iterator ihit;
    for (ihit = hits->begin(); ihit != hits->end(); ihit++) {
      DetId detId(ihit->id());
      const GlobalPoint rechitPoint =
          (detId.det() == DetId::Hcal)
              ? (static_cast<const HcalGeometry*>(geo->getSubdetectorGeometry(detId)))->getPosition(detId)
              : geo->getPosition(detId);
      if (spr::getDistInPlaneTrackDir(hpoint1, trackMom, rechitPoint, debug) < dR) {
        hit.push_back(ihit);
      }
    }
    return hit;
  }

}  // namespace spr