00001
00010 #include "DQM/PhysicsObjectsMonitoring/interface/PhysicsObjectsMonitor.h"
00011
00012
00013 #include "FWCore/Framework/interface/MakerMacros.h"
00014 #include "FWCore/Framework/interface/Event.h"
00015 #include "FWCore/Framework/interface/ESHandle.h"
00016
00017 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00018
00019 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
00020 #include "DataFormats/TrackReco/interface/Track.h"
00021 #include "RecoMuon/TrackingTools/interface/MuonPatternRecoDumper.h"
00022
00023
00024 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
00025
00026 #include <FWCore/MessageLogger/interface/MessageLogger.h>
00027 #include "DQMServices/Core/interface/DQMStore.h"
00028 #include "DQMServices/Core/interface/MonitorElement.h"
00029
00030
00031 using namespace std;
00032 using namespace edm;
00033
00035 PhysicsObjectsMonitor::PhysicsObjectsMonitor(const ParameterSet& pset){
00036 theSTAMuonLabel = pset.getUntrackedParameter<string>("StandAloneTrackCollectionLabel");
00037 theSeedCollectionLabel = pset.getUntrackedParameter<string>("MuonSeedCollectionLabel");
00038
00039 theRootFileName = pset.getUntrackedParameter<string>("rootFileName");
00040 saveRootFile = pset.getUntrackedParameter<bool>("produceRootFile");
00041
00042 theDataType = pset.getUntrackedParameter<string>("DataType");
00043
00044 if(theDataType != "RealData" && theDataType != "SimData")
00045 edm::LogInfo ("PhysicsObjectsMonitor") << "Error in Data Type!!"<<endl;
00046
00047 numberOfSimTracks=0;
00048 numberOfRecTracks=0;
00049
00051 dbe = edm::Service<DQMStore>().operator->();
00052
00053
00054
00055
00056 }
00057
00059 PhysicsObjectsMonitor::~PhysicsObjectsMonitor(){
00060 }
00061
00062 void PhysicsObjectsMonitor::beginJob(){
00063
00064 dbe->setCurrentFolder("PhysicsObjects/MuonReconstruction");
00065
00066
00067 hPres = dbe->book1D("pTRes","pT Resolution",100,-2,2);
00068 h1_Pres =dbe->book1D("invPTRes","1/pT Resolution",100,-2,2);
00069
00070 charge= dbe->book1D("charge","track charge",5,-2.5,2.5);
00071 ptot = dbe->book1D("ptot","track momentum",50,0,50);
00072 pt = dbe->book1D("pt","track pT",100,0,50);
00073 px = dbe->book1D("px ","track px",100,-50,50);
00074 py = dbe->book1D("py","track py",100,-50,50);
00075 pz = dbe->book1D("pz","track pz",100,-50,50);
00076 Nmuon = dbe->book1D("Nmuon","Number of muon tracks",11,-.5,10.5);
00077 Nrechits = dbe->book1D("Nrechits","Number of RecHits/Segments on track",21,-.5,21.5);
00078 NDThits = dbe->book1D("NDThits","Number of DT Hits/Segments on track",31,-.5,31.5);
00079 NCSChits = dbe->book1D("NCSChits","Number of CSC Hits/Segments on track",31,-.5,31.5);
00080 NRPChits = dbe->book1D("NRPChits","Number of RPC hits on track",11,-.5,11.5);
00081
00082 DTvsCSC = dbe->book2D("DTvsCSC","Number of DT vs CSC hits on track",29,-.5,28.5,29,-.5,28.5);
00083 TH2F * root_ob = DTvsCSC->getTH2F();
00084 root_ob->SetXTitle("Number of DT hits");
00085 root_ob->SetYTitle("Number of CSC hits");
00086
00087 }
00088
00089 void PhysicsObjectsMonitor::endJob(){
00090
00091 if(theDataType == "SimData"){
00092
00093 edm::LogInfo ("PhysicsObjectsMonitor") << "Sorry! Running this package on simulation is no longer supported! ";
00094 }
00095
00096 edm::LogInfo ("PhysicsObjectsMonitor") << "Number of Reco tracks: " << numberOfRecTracks ;
00097
00098 if(saveRootFile) dbe->save(theRootFileName);
00099 dbe->setCurrentFolder("PhysicsObjects/MuonReconstruction");
00100 dbe->removeContents();
00101
00102
00103 }
00104
00105
00106 void PhysicsObjectsMonitor::analyze(const Event & event, const EventSetup& eventSetup){
00107
00108 edm::LogInfo ("PhysicsObjectsMonitor") << "Run: " << event.id().run() << " Event: " << event.id().event();
00109 MuonPatternRecoDumper debug;
00110
00111
00112 Handle<reco::TrackCollection> staTracks;
00113 event.getByLabel(theSTAMuonLabel, staTracks);
00114
00115 ESHandle<MagneticField> theMGField;
00116 eventSetup.get<IdealMagneticFieldRecord>().get(theMGField);
00117
00118
00119 double recPt=0.;
00120 double simPt=0.;
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 reco::TrackCollection::const_iterator staTrack;
00144
00145 edm::LogInfo ("PhysicsObjectsMonitor") << "Reconstructed tracks: " << staTracks->size() << endl;
00146 Nmuon->Fill(staTracks->size());
00147 for (staTrack = staTracks->begin(); staTrack != staTracks->end(); ++staTrack){
00148 reco::TransientTrack track(*staTrack,&*theMGField);
00149
00150 int nrechits=0;
00151 int nDThits=0;
00152 int nCSChits=0;
00153 int nRPChits=0;
00154
00155 for (trackingRecHit_iterator it = track.recHitsBegin (); it != track.recHitsEnd (); it++) {
00156 if ((*it)->isValid ()) {
00157 edm::LogInfo ("PhysicsObjectsMonitor") << "Analyzer: Aha this looks like a Rechit!" << std::endl;
00158 if((*it)->geographicalId().subdetId() == MuonSubdetId::DT) {
00159 nDThits++;
00160 } else if((*it)->geographicalId().subdetId() == MuonSubdetId::CSC) {
00161 nCSChits++;
00162 } else if((*it)->geographicalId().subdetId() == MuonSubdetId::RPC) {
00163 nRPChits++;
00164 } else {
00165 edm::LogInfo ("PhysicsObjectsMonitor") << "This is an UNKNOWN hit !! " << std::endl;
00166 }
00167 nrechits++;
00168 }
00169 }
00170
00171 Nrechits->Fill(nrechits);
00172 NDThits->Fill(nDThits);
00173 NCSChits->Fill(nCSChits);
00174 DTvsCSC->Fill(nDThits,nCSChits);
00175 NRPChits->Fill(nRPChits);
00176
00177 debug.dumpFTS(track.impactPointTSCP().theState());
00178
00179 recPt = track.impactPointTSCP().momentum().perp();
00180 edm::LogInfo ("PhysicsObjectsMonitor") << " p: "<<track.impactPointTSCP().momentum().mag()<< " pT: "<<recPt<<endl;
00181 pt->Fill(recPt);
00182 ptot->Fill(track.impactPointTSCP().momentum().mag());
00183 charge->Fill(track.impactPointTSCP().charge());
00184 px->Fill(track.impactPointTSCP().momentum().x());
00185 py->Fill(track.impactPointTSCP().momentum().y());
00186 pz->Fill(track.impactPointTSCP().momentum().z());
00187 }
00188 edm::LogInfo ("PhysicsObjectsMonitor") <<"---"<<endl;
00189 if(recPt && theDataType == "SimData"){
00190 hPres->Fill( (recPt-simPt)/simPt);
00191 h1_Pres->Fill( ( 1/recPt - 1/simPt)/ (1/simPt));
00192
00193 }
00194 }
00195
00196 DEFINE_FWK_MODULE(PhysicsObjectsMonitor);