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 142 143 144 145 146 147 148
#include "Alignment/CommonAlignmentProducer/interface/AlignmentCSCOverlapSelector.h"

#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"

#include "DataFormats/DetId/interface/DetId.h"
#include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
#include "DataFormats/MuonDetId/interface/CSCDetId.h"
#include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
#include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"

// constructor ----------------------------------------------------------------

AlignmentCSCOverlapSelector::AlignmentCSCOverlapSelector(const edm::ParameterSet &iConfig)
    : m_station(iConfig.getParameter<int>("station")),
      m_minHitsPerChamber(iConfig.getParameter<unsigned int>("minHitsPerChamber")) {
  if (m_station == 0) {
    edm::LogInfo("AlignmentCSCOverlapSelector")
        << "Acceptable tracks must have " << m_minHitsPerChamber << " in two chambers on all stations." << std::endl;
  } else {
    edm::LogInfo("AlignmentCSCOverlapSelector") << "Acceptable tracks must have " << m_minHitsPerChamber
                                                << " in two chambers on station " << m_station << "." << std::endl;
  }
}

void AlignmentCSCOverlapSelector::fillPSetDescription(edm::ParameterSetDescription &desc) {
  desc.add<int>("station", 1);
  desc.add<unsigned int>("minHitsPerChamber", 0);
}

// destructor -----------------------------------------------------------------

AlignmentCSCOverlapSelector::~AlignmentCSCOverlapSelector() {}

// do selection ---------------------------------------------------------------

AlignmentCSCOverlapSelector::Tracks AlignmentCSCOverlapSelector::select(const Tracks &tracks,
                                                                        const edm::Event &iEvent) const {
  Tracks result;

  for (auto const &track : tracks) {
    unsigned int MEminus4_even = 0;
    unsigned int MEminus4_odd = 0;
    unsigned int MEminus3_even = 0;
    unsigned int MEminus3_odd = 0;
    unsigned int MEminus2_even = 0;
    unsigned int MEminus2_odd = 0;
    unsigned int MEminus1_even = 0;
    unsigned int MEminus1_odd = 0;

    unsigned int MEplus1_even = 0;
    unsigned int MEplus1_odd = 0;
    unsigned int MEplus2_even = 0;
    unsigned int MEplus2_odd = 0;
    unsigned int MEplus3_even = 0;
    unsigned int MEplus3_odd = 0;
    unsigned int MEplus4_even = 0;
    unsigned int MEplus4_odd = 0;

    for (auto const &hit : track->recHits()) {
      DetId id = hit->geographicalId();
      if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::CSC) {
        CSCDetId cscid(id.rawId());
        int station = (cscid.endcap() == 1 ? 1 : -1) * cscid.station();

        if (station == -4) {
          if (cscid.chamber() % 2 == 0)
            MEminus4_even++;
          else
            MEminus4_odd++;
        } else if (station == -3) {
          if (cscid.chamber() % 2 == 0)
            MEminus3_even++;
          else
            MEminus3_odd++;
        } else if (station == -2) {
          if (cscid.chamber() % 2 == 0)
            MEminus2_even++;
          else
            MEminus2_odd++;
        } else if (station == -1) {
          if (cscid.chamber() % 2 == 0)
            MEminus1_even++;
          else
            MEminus1_odd++;
        }

        else if (station == 1) {
          if (cscid.chamber() % 2 == 0)
            MEplus1_even++;
          else
            MEplus1_odd++;
        } else if (station == 2) {
          if (cscid.chamber() % 2 == 0)
            MEplus2_even++;
          else
            MEplus2_odd++;
        } else if (station == 3) {
          if (cscid.chamber() % 2 == 0)
            MEplus3_even++;
          else
            MEplus3_odd++;
        } else if (station == 4) {
          if (cscid.chamber() % 2 == 0)
            MEplus4_even++;
          else
            MEplus4_odd++;
        }

      }  // end if it's a CSC hit
    }  // end loop over hits

    if ((m_station == 0 || m_station == -4) && (MEminus4_even >= m_minHitsPerChamber) &&
        (MEminus4_odd >= m_minHitsPerChamber))
      result.push_back(track);

    else if ((m_station == 0 || m_station == -3) && (MEminus3_even >= m_minHitsPerChamber) &&
             (MEminus3_odd >= m_minHitsPerChamber))
      result.push_back(track);

    else if ((m_station == 0 || m_station == -2) && (MEminus2_even >= m_minHitsPerChamber) &&
             (MEminus2_odd >= m_minHitsPerChamber))
      result.push_back(track);

    else if ((m_station == 0 || m_station == -1) && (MEminus1_even >= m_minHitsPerChamber) &&
             (MEminus1_odd >= m_minHitsPerChamber))
      result.push_back(track);

    else if ((m_station == 0 || m_station == 1) && (MEplus1_even >= m_minHitsPerChamber) &&
             (MEplus1_odd >= m_minHitsPerChamber))
      result.push_back(track);

    else if ((m_station == 0 || m_station == 2) && (MEplus2_even >= m_minHitsPerChamber) &&
             (MEplus2_odd >= m_minHitsPerChamber))
      result.push_back(track);

    else if ((m_station == 0 || m_station == 3) && (MEplus3_even >= m_minHitsPerChamber) &&
             (MEplus3_odd >= m_minHitsPerChamber))
      result.push_back(track);

    else if ((m_station == 0 || m_station == 4) && (MEplus4_even >= m_minHitsPerChamber) &&
             (MEplus4_odd >= m_minHitsPerChamber))
      result.push_back(track);

  }  // end loop over tracks

  return result;
}