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
/** \class PhysicsObjectsMonitor
 *  Analyzer of the StandAlone muon tracks
 *
 *  \author M. Mulders - CERN <martijn.mulders@cern.ch>
 *  Based on STAMuonAnalyzer by R. Bellan - INFN Torino
 *<riccardo.bellan@cern.ch>
 */

#include "DQM/PhysicsObjectsMonitoring/interface/PhysicsObjectsMonitor.h"

// Collaborating Class Header
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/MakerMacros.h"

#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"

#include "DataFormats/TrackReco/interface/Track.h"
#include "RecoMuon/TrackingTools/interface/MuonPatternRecoDumper.h"
#include "TrackingTools/TransientTrack/interface/TransientTrack.h"

#include "DataFormats/MuonDetId/interface/MuonSubdetId.h"

#include "DQMServices/Core/interface/DQMStore.h"
#include <FWCore/MessageLogger/interface/MessageLogger.h>

using namespace std;
using namespace edm;

/// Constructor
PhysicsObjectsMonitor::PhysicsObjectsMonitor(const ParameterSet &pset) {
  theSTAMuonLabel = pset.getUntrackedParameter<string>("StandAloneTrackCollectionLabel");
  theSeedCollectionLabel = pset.getUntrackedParameter<string>("MuonSeedCollectionLabel");
  theDataType = pset.getUntrackedParameter<string>("DataType");
  magFiledToken_ = esConsumes();
  if (theDataType != "RealData" && theDataType != "SimData")
    edm::LogInfo("PhysicsObjectsMonitor") << "Error in Data Type!!" << endl;

  if (theDataType == "SimData") {
    edm::LogInfo("PhysicsObjectsMonitor") << "Sorry! Running this package on simulation is no longer supported! ";
  }

  // set Token(-s)
  theSTAMuonToken_ =
      consumes<reco::TrackCollection>(pset.getUntrackedParameter<string>("StandAloneTrackCollectionLabel"));
}

/// Destructor
PhysicsObjectsMonitor::~PhysicsObjectsMonitor() {}

void PhysicsObjectsMonitor::bookHistograms(DQMStore::IBooker &iBooker, edm::Run const &, edm::EventSetup const &) {
  iBooker.setCurrentFolder("PhysicsObjects/MuonReconstruction");

  hPres = iBooker.book1D("pTRes", "pT Resolution", 100, -2, 2);
  h1_Pres = iBooker.book1D("invPTRes", "1/pT Resolution", 100, -2, 2);

  charge = iBooker.book1D("charge", "track charge", 5, -2.5, 2.5);
  ptot = iBooker.book1D("ptot", "track momentum", 50, 0, 50);
  pt = iBooker.book1D("pt", "track pT", 100, 0, 50);
  px = iBooker.book1D("px ", "track px", 100, -50, 50);
  py = iBooker.book1D("py", "track py", 100, -50, 50);
  pz = iBooker.book1D("pz", "track pz", 100, -50, 50);
  Nmuon = iBooker.book1D("Nmuon", "Number of muon tracks", 11, -.5, 10.5);
  Nrechits = iBooker.book1D("Nrechits", "Number of RecHits/Segments on track", 21, -.5, 21.5);
  NDThits = iBooker.book1D("NDThits", "Number of DT Hits/Segments on track", 31, -.5, 31.5);
  NCSChits = iBooker.book1D("NCSChits", "Number of CSC Hits/Segments on track", 31, -.5, 31.5);
  NRPChits = iBooker.book1D("NRPChits", "Number of RPC hits on track", 11, -.5, 11.5);

  DTvsCSC = iBooker.book2D("DTvsCSC", "Number of DT vs CSC hits on track", 29, -.5, 28.5, 29, -.5, 28.5);
  TH2F *root_ob = DTvsCSC->getTH2F();
  root_ob->SetXTitle("Number of DT hits");
  root_ob->SetYTitle("Number of CSC hits");
}

void PhysicsObjectsMonitor::analyze(const Event &event, const EventSetup &eventSetup) {
  edm::LogInfo("PhysicsObjectsMonitor") << "Run: " << event.id().run() << " Event: " << event.id().event();
  MuonPatternRecoDumper debug;

  // Get the RecTrack collection from the event
  Handle<reco::TrackCollection> staTracks;
  event.getByToken(theSTAMuonToken_, staTracks);

  const auto &theMGField = eventSetup.getHandle(magFiledToken_);

  double recPt = 0.;
  double simPt = 0.;

  reco::TrackCollection::const_iterator staTrack;

  edm::LogInfo("PhysicsObjectsMonitor") << "Reconstructed tracks: " << staTracks->size() << endl;
  Nmuon->Fill(staTracks->size());
  for (staTrack = staTracks->begin(); staTrack != staTracks->end(); ++staTrack) {
    reco::TransientTrack track(*staTrack, &*theMGField);

    int nrechits = 0;
    int nDThits = 0;
    int nCSChits = 0;
    int nRPChits = 0;

    for (trackingRecHit_iterator it = track.recHitsBegin(); it != track.recHitsEnd(); it++) {
      if ((*it)->isValid()) {
        edm::LogInfo("PhysicsObjectsMonitor") << "Analyzer:  Aha this looks like a Rechit!" << std::endl;
        if ((*it)->geographicalId().subdetId() == MuonSubdetId::DT) {
          nDThits++;
        } else if ((*it)->geographicalId().subdetId() == MuonSubdetId::CSC) {
          nCSChits++;
        } else if ((*it)->geographicalId().subdetId() == MuonSubdetId::RPC) {
          nRPChits++;
        } else {
          edm::LogInfo("PhysicsObjectsMonitor") << "This is an UNKNOWN hit !! " << std::endl;
        }
        nrechits++;
      }
    }

    Nrechits->Fill(nrechits);
    NDThits->Fill(nDThits);
    NCSChits->Fill(nCSChits);
    DTvsCSC->Fill(nDThits, nCSChits);
    NRPChits->Fill(nRPChits);

    debug.dumpFTS(track.impactPointTSCP().theState());

    recPt = track.impactPointTSCP().momentum().perp();
    edm::LogInfo("PhysicsObjectsMonitor")
        << " p: " << track.impactPointTSCP().momentum().mag() << " pT: " << recPt << endl;
    pt->Fill(recPt);
    ptot->Fill(track.impactPointTSCP().momentum().mag());
    charge->Fill(track.impactPointTSCP().charge());
    px->Fill(track.impactPointTSCP().momentum().x());
    py->Fill(track.impactPointTSCP().momentum().y());
    pz->Fill(track.impactPointTSCP().momentum().z());
  }
  edm::LogInfo("PhysicsObjectsMonitor") << "---" << endl;
  if (recPt && theDataType == "SimData") {
    hPres->Fill((recPt - simPt) / simPt);
    h1_Pres->Fill((1 / recPt - 1 / simPt) / (1 / simPt));
  }
}

DEFINE_FWK_MODULE(PhysicsObjectsMonitor);