ArbitrationType

Muon

MuonTrackType

Selector

Macros

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 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
#ifndef MuonReco_Muon_h
#define MuonReco_Muon_h
/** \class reco::Muon Muon.h DataFormats/MuonReco/interface/Muon.h
 *  
 * A reconstructed Muon.
 * contains reference to three fits:
 *  - tracker alone
 *  - muon detector alone
 *  - combined muon plus tracker
 *
 * \author Luca Lista, Claudio Campagnari, Dmytro Kovalskyi, Jake Ribnik, Riccardo Bellan, Michalis Bachtis
 *
 *
 */
#include "DataFormats/RecoCandidate/interface/RecoCandidate.h"
#include "DataFormats/MuonReco/interface/MuonChamberMatch.h"
#include "DataFormats/MuonReco/interface/MuonIsolation.h"
#include "DataFormats/MuonReco/interface/MuonPFIsolation.h"
#include "DataFormats/MuonReco/interface/MuonEnergy.h"
#include "DataFormats/MuonReco/interface/MuonTime.h"
#include "DataFormats/MuonReco/interface/MuonQuality.h"
#include "DataFormats/TrackReco/interface/TrackFwd.h"
#include "DataFormats/TrackReco/interface/Track.h"

namespace reco {

  class Muon : public RecoCandidate {
  public:
    Muon();
    /// constructor from values
    Muon(Charge, const LorentzVector&, const Point& = Point(0, 0, 0));
    /// create a clone
    Muon* clone() const override;

    /// map for Global Muon refitters
    enum MuonTrackType { None, InnerTrack, OuterTrack, CombinedTrack, TPFMS, Picky, DYT };
    typedef std::map<MuonTrackType, reco::TrackRef> MuonTrackRefMap;
    typedef std::pair<TrackRef, Muon::MuonTrackType> MuonTrackTypePair;

    ///
    /// ====================== TRACK BLOCK ===========================
    ///
    /// reference to Track reconstructed in the tracker only
    using reco::RecoCandidate::track;
    virtual TrackRef innerTrack() const { return innerTrack_; }
    TrackRef track() const override { return innerTrack(); }
    /// reference to Track reconstructed in the muon detector only
    virtual TrackRef outerTrack() const { return outerTrack_; }
    TrackRef standAloneMuon() const override { return outerTrack(); }
    /// reference to Track reconstructed in both tracked and muon detector
    virtual TrackRef globalTrack() const { return globalTrack_; }
    TrackRef combinedMuon() const override { return globalTrack(); }

    virtual TrackRef tpfmsTrack() const { return muonTrackFromMap(TPFMS); }
    virtual TrackRef pickyTrack() const { return muonTrackFromMap(Picky); }
    virtual TrackRef dytTrack() const { return muonTrackFromMap(DYT); }

    const Track* bestTrack() const override { return muonTrack(bestTrackType_).get(); }
    TrackBaseRef bestTrackRef() const override { return reco::TrackBaseRef(muonTrack(bestTrackType_)); }
    virtual TrackRef muonBestTrack() const { return muonTrack(bestTrackType_); }
    virtual MuonTrackType muonBestTrackType() const { return bestTrackType_; }
    virtual TrackRef tunePMuonBestTrack() const { return muonTrack(bestTunePTrackType_); }
    virtual MuonTrackType tunePMuonBestTrackType() const { return bestTunePTrackType_; }

    bool isAValidMuonTrack(const MuonTrackType& type) const;
    TrackRef muonTrack(const MuonTrackType&) const;

    TrackRef muonTrackFromMap(const MuonTrackType& type) const {
      MuonTrackRefMap::const_iterator iter = refittedTrackMap_.find(type);
      if (iter != refittedTrackMap_.end())
        return iter->second;
      else
        return TrackRef();
    }

    /// set reference to Track
    virtual void setInnerTrack(const TrackRef& t);
    virtual void setTrack(const TrackRef& t);
    /// set reference to Track
    virtual void setOuterTrack(const TrackRef& t);
    virtual void setStandAlone(const TrackRef& t);
    /// set reference to Track
    virtual void setGlobalTrack(const TrackRef& t);
    virtual void setCombined(const TrackRef& t);
    // set reference to the Best Track
    virtual void setBestTrack(MuonTrackType muonType) { bestTrackType_ = muonType; }
    // set reference to the Best Track by PF
    virtual void setTunePBestTrack(MuonTrackType muonType) { bestTunePTrackType_ = muonType; }

    void setMuonTrack(const MuonTrackType&, const TrackRef&);

    ///set reference to PFCandidate
    ///
    /// ====================== PF BLOCK ===========================
    ///

    reco::Candidate::LorentzVector pfP4() const { return pfP4_; }
    virtual void setPFP4(const reco::Candidate::LorentzVector& p4_);

    ///
    /// ====================== ENERGY BLOCK ===========================
    ///
    /// energy deposition
    bool isEnergyValid() const { return energyValid_; }
    /// get energy deposition information
    MuonEnergy calEnergy() const { return calEnergy_; }
    /// set energy deposition information
    void setCalEnergy(const MuonEnergy& calEnergy) {
      calEnergy_ = calEnergy;
      energyValid_ = true;
    }

    ///
    /// ====================== Quality BLOCK ===========================
    ///
    /// energy deposition
    bool isQualityValid() const { return qualityValid_; }
    /// get energy deposition information
    MuonQuality combinedQuality() const { return combinedQuality_; }
    /// set energy deposition information
    void setCombinedQuality(const MuonQuality& combinedQuality) {
      combinedQuality_ = combinedQuality;
      qualityValid_ = true;
    }

    ///
    /// ====================== TIMING BLOCK ===========================
    ///
    /// timing information
    bool isTimeValid() const { return (time_.nDof > 0); }
    /// get DT/CSC combined timing information
    MuonTime time() const { return time_; }
    /// set DT/CSC combined timing information
    void setTime(const MuonTime& time) { time_ = time; }
    /// get RPC timing information
    MuonTime rpcTime() const { return rpcTime_; }
    /// set RPC timing information
    void setRPCTime(const MuonTime& time) { rpcTime_ = time; }

    ///
    /// ====================== MUON MATCH BLOCK ===========================
    ///
    bool isMatchesValid() const { return matchesValid_; }
    /// get muon matching information
    std::vector<MuonChamberMatch>& matches() { return muMatches_; }
    const std::vector<MuonChamberMatch>& matches() const { return muMatches_; }
    /// set muon matching information
    void setMatches(const std::vector<MuonChamberMatch>& matches) {
      muMatches_ = matches;
      matchesValid_ = true;
    }

    ///
    /// ====================== MUON COMPATIBILITY BLOCK ===========================
    ///
    /// Relative likelihood based on ECAL, HCAL, HO energy defined as
    /// L_muon/(L_muon+L_not_muon)
    float caloCompatibility() const { return caloCompatibility_; }
    void setCaloCompatibility(float input) { caloCompatibility_ = input; }
    bool isCaloCompatibilityValid() const { return caloCompatibility_ >= 0; }

    ///
    /// ====================== ISOLATION BLOCK ===========================
    ///
    /// Summary of muon isolation information
    const MuonIsolation& isolationR03() const { return isolationR03_; }
    const MuonIsolation& isolationR05() const { return isolationR05_; }

    const MuonPFIsolation& pfIsolationR03() const { return pfIsolationR03_; }
    const MuonPFIsolation& pfMeanDRIsoProfileR03() const { return pfIsoMeanDRR03_; }
    const MuonPFIsolation& pfSumDRIsoProfileR03() const { return pfIsoSumDRR03_; }
    const MuonPFIsolation& pfIsolationR04() const { return pfIsolationR04_; }
    const MuonPFIsolation& pfMeanDRIsoProfileR04() const { return pfIsoMeanDRR04_; }
    const MuonPFIsolation& pfSumDRIsoProfileR04() const { return pfIsoSumDRR04_; }

    void setIsolation(const MuonIsolation& isoR03, const MuonIsolation& isoR05);
    bool isIsolationValid() const { return isolationValid_; }
    void setPFIsolation(const std::string& label, const reco::MuonPFIsolation& deposit);

    bool isPFIsolationValid() const { return pfIsolationValid_; }

    /// define arbitration schemes
    // WARNING: There can be not more than 7 arbritration types. If
    //          have more it will break the matching logic for types
    //          defined in MuonSegmentMatch

    enum ArbitrationType {
      NoArbitration,
      SegmentArbitration,
      SegmentAndTrackArbitration,
      SegmentAndTrackArbitrationCleaned,
      RPCHitAndTrackArbitration,
      GEMSegmentAndTrackArbitration,
      ME0SegmentAndTrackArbitration,
      GEMHitAndTrackArbitration
    };

    ///
    /// ====================== STANDARD SELECTORS ===========================
    ///
    // When adding new selectors, also update DataFormats/MuonReco/interface/MuonSelectors.h string to enum map
    enum Selector {
      CutBasedIdLoose = 0,
      CutBasedIdMedium = 1,
      CutBasedIdMediumPrompt = 2,  // medium with IP cuts
      CutBasedIdTight = 3,
      CutBasedIdGlobalHighPt = 4,  // high pt muon for Z',W' (better momentum resolution)
      CutBasedIdTrkHighPt = 5,     // high pt muon for boosted Z (better efficiency)
      PFIsoVeryLoose = 6,          // reliso<0.40
      PFIsoLoose = 7,              // reliso<0.25
      PFIsoMedium = 8,             // reliso<0.20
      PFIsoTight = 9,              // reliso<0.15
      PFIsoVeryTight = 10,         // reliso<0.10
      TkIsoLoose = 11,             // reliso<0.10
      TkIsoTight = 12,             // reliso<0.05
      SoftCutBasedId = 13,
      SoftMvaId = 14,
      MvaLoose = 15,
      MvaMedium = 16,
      MvaTight = 17,
      MiniIsoLoose = 18,      // reliso<0.40
      MiniIsoMedium = 19,     // reliso<0.20
      MiniIsoTight = 20,      // reliso<0.10
      MiniIsoVeryTight = 21,  // reliso<0.05
      TriggerIdLoose = 22,    // robust selector for HLT
      InTimeMuon = 23,
      PFIsoVeryVeryTight = 24,  // reliso<0.05
      MultiIsoLoose = 25,       // miniIso with ptRatio and ptRel
      MultiIsoMedium = 26,      // miniIso with ptRatio and ptRel
      PuppiIsoLoose = 27,
      PuppiIsoMedium = 28,
      PuppiIsoTight = 29,
      MvaVTight = 30,
      MvaVVTight = 31,
      LowPtMvaLoose = 32,
      LowPtMvaMedium = 33,
      MvaIDwpMedium = 34,
      MvaIDwpTight = 35,
    };

    bool passed(uint64_t selection) const { return (selectors_ & selection) == selection; }
    bool passed(Selector selection) const { return passed(static_cast<uint64_t>(1UL << selection)); }
    uint64_t selectors() const { return selectors_; }
    void setSelectors(uint64_t selectors) { selectors_ = selectors; }
    void setSelector(Selector selector, bool passed) {
      auto selector64 = 1UL << selector;
      if (passed)
        selectors_ |= selector64;
      else
        selectors_ &= ~selector64;
    }

    ///
    /// ====================== USEFUL METHODs ===========================
    ///
    /// number of chambers (MuonChamberMatches include RPC rolls, GEM and ME0 segments)
    int numberOfChambers() const { return muMatches_.size(); }
    /// number of chambers CSC or DT matches only (MuonChamberMatches include RPC rolls)
    int numberOfChambersCSCorDT() const;
    /// get number of chambers with matched segments
    int numberOfMatches(ArbitrationType type = SegmentAndTrackArbitration) const;
    /// get number of stations with matched segments
    /// just adds the bits returned by stationMask
    int numberOfMatchedStations(ArbitrationType type = SegmentAndTrackArbitration) const;
    /// expected number of stations with matching segments based on the absolute
    /// distance from the edge of a chamber
    unsigned int expectedNnumberOfMatchedStations(float minDistanceFromEdge = 10.0) const;
    /// get bit map of stations with matched segments
    /// bits 0-1-2-3 = DT stations 1-2-3-4
    /// bits 4-5-6-7 = CSC stations 1-2-3-4
    unsigned int stationMask(ArbitrationType type = SegmentAndTrackArbitration) const;
    /// get bit map of stations with tracks within
    /// given distance (in cm) of chamber edges
    /// bit assignments are same as above
    int numberOfMatchedRPCLayers(ArbitrationType type = RPCHitAndTrackArbitration) const;
    unsigned int RPClayerMask(ArbitrationType type = RPCHitAndTrackArbitration) const;
    unsigned int stationGapMaskDistance(float distanceCut = 10.) const;
    /// same as above for given number of sigmas
    unsigned int stationGapMaskPull(float sigmaCut = 3.) const;
    /// # of digis in a given station layer
    int nDigisInStation(int station, int muonSubdetId) const;
    /// tag a shower in a given station layer
    bool hasShowerInStation(int station, int muonSubdetId, int nDtDigisCut = 20, int nCscDigisCut = 36) const;
    /// count the number of showers along a muon track
    int numberOfShowers(int nDtDigisCut = 20, int nCscDigisCut = 36) const;

    /// muon type - type of the algorithm that reconstructed this muon
    /// multiple algorithms can reconstruct the same muon
    static const unsigned int GlobalMuon = 1 << 1;
    static const unsigned int TrackerMuon = 1 << 2;
    static const unsigned int StandAloneMuon = 1 << 3;
    static const unsigned int CaloMuon = 1 << 4;
    static const unsigned int PFMuon = 1 << 5;
    static const unsigned int RPCMuon = 1 << 6;
    static const unsigned int GEMMuon = 1 << 7;
    static const unsigned int ME0Muon = 1 << 8;

    void setType(unsigned int type) { type_ = type; }
    unsigned int type() const { return type_; }

    // override of method in base class reco::Candidate
    bool isMuon() const override { return true; }
    bool isGlobalMuon() const override { return type_ & GlobalMuon; }
    bool isTrackerMuon() const override { return type_ & TrackerMuon; }
    bool isStandAloneMuon() const override { return type_ & StandAloneMuon; }
    bool isCaloMuon() const override { return type_ & CaloMuon; }
    bool isPFMuon() const { return type_ & PFMuon; }  //fix me ! Has to go to type
    bool isRPCMuon() const { return type_ & RPCMuon; }
    bool isGEMMuon() const { return type_ & GEMMuon; }
    bool isME0Muon() const { return type_ & ME0Muon; }

  private:
    /// check overlap with another candidate
    bool overlap(const Candidate&) const override;
    /// reference to Track reconstructed in the tracker only
    TrackRef innerTrack_;
    /// reference to Track reconstructed in the muon detector only
    TrackRef outerTrack_;
    /// reference to Track reconstructed in both tracked and muon detector
    TrackRef globalTrack_;
    /// reference to the Global Track refitted with dedicated TeV reconstructors
    MuonTrackRefMap refittedTrackMap_;
    /// reference to the Track chosen to assign the momentum value to the muon
    MuonTrackType bestTrackType_;
    /// reference to the Track chosen to assign the momentum value to the muon by PF
    MuonTrackType bestTunePTrackType_;

    /// energy deposition
    MuonEnergy calEnergy_;
    /// quality block
    MuonQuality combinedQuality_;
    /// Information on matching between tracks and segments
    std::vector<MuonChamberMatch> muMatches_;
    /// timing
    MuonTime time_;
    MuonTime rpcTime_;
    bool energyValid_;
    bool matchesValid_;
    bool isolationValid_;
    bool pfIsolationValid_;
    bool qualityValid_;
    /// muon hypothesis compatibility with observer calorimeter energy
    float caloCompatibility_;
    /// Isolation information for two cones with dR=0.3 and dR=0.5
    MuonIsolation isolationR03_;
    MuonIsolation isolationR05_;

    /// PF Isolation information for two cones with dR=0.3 and dR=0.4
    MuonPFIsolation pfIsolationR03_;
    MuonPFIsolation pfIsoMeanDRR03_;
    MuonPFIsolation pfIsoSumDRR03_;
    MuonPFIsolation pfIsolationR04_;
    MuonPFIsolation pfIsoMeanDRR04_;
    MuonPFIsolation pfIsoSumDRR04_;

    /// muon type mask
    unsigned int type_;

    //PF muon p4
    reco::Candidate::LorentzVector pfP4_;

    // FixMe: Still missing trigger information

    /// get vector of muon chambers for given station and detector
    const std::vector<const MuonChamberMatch*> chambers(int station, int muonSubdetId) const;
    /// get pointers to best segment and corresponding chamber in vector of chambers
    std::pair<const MuonChamberMatch*, const MuonSegmentMatch*> pair(
        const std::vector<const MuonChamberMatch*>&, ArbitrationType type = SegmentAndTrackArbitration) const;
    /// selector bitmap
    uint64_t selectors_;

  public:
    /// get number of segments
    int numberOfSegments(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    /// get deltas between (best) segment and track
    /// If no chamber or no segment returns 999999
    float dX(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float dY(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float dDxDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float dDyDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float pullX(int station,
                int muonSubdetId,
                ArbitrationType type = SegmentAndTrackArbitration,
                bool includeSegmentError = true) const;
    float pullY(int station,
                int muonSubdetId,
                ArbitrationType type = SegmentAndTrackArbitration,
                bool includeSegmentError = true) const;
    float pullDxDz(int station,
                   int muonSubdetId,
                   ArbitrationType type = SegmentAndTrackArbitration,
                   bool includeSegmentError = true) const;
    float pullDyDz(int station,
                   int muonSubdetId,
                   ArbitrationType type = SegmentAndTrackArbitration,
                   bool includeSegmentError = true) const;
    /// get (best) segment information
    /// If no segment returns 999999
    float segmentX(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float segmentY(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float segmentDxDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float segmentDyDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float segmentXErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float segmentYErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float segmentDxDzErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float segmentDyDzErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    /// get track information in chamber that contains (best) segment
    /// If no segment, get track information in chamber that has the most negative distance between the track
    /// and the nearest chamber edge (the chamber with the deepest track)
    /// If no chamber returns 999999
    float trackEdgeX(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackEdgeY(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackX(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackY(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackDxDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackDyDz(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackXErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackYErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackDxDzErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackDyDzErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackDist(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;
    float trackDistErr(int station, int muonSubdetId, ArbitrationType type = SegmentAndTrackArbitration) const;

    float t0(int n = 0) {
      int i = 0;
      for (auto& chamber : muMatches_) {
        int segmentMatchesSize = (int)chamber.segmentMatches.size();
        if (i + segmentMatchesSize < n) {
          i += segmentMatchesSize;
          continue;
        }
        return chamber.segmentMatches[n - i].t0;
      }
      return 0;
    }
  };

}  // namespace reco

#endif