File indexing completed on 2024-04-06 12:32:49
0001
0002
0003
0004
0005
0006
0007 #include "MuonDTDigis.h"
0008
0009 #include <iostream>
0010 #include <string>
0011
0012 #include "TFile.h"
0013
0014 #include "SimMuon/DTDigitizer/interface/Histograms.h"
0015
0016 using namespace edm;
0017 using namespace std;
0018
0019 MuonDTDigis::MuonDTDigis(const ParameterSet &pset) : muonGeomToken_(esConsumes()) {
0020
0021
0022 verbose_ = pset.getUntrackedParameter<bool>("verbose", false);
0023
0024
0025 SimHitToken_ = consumes<edm::PSimHitContainer>(pset.getParameter<edm::InputTag>("SimHitLabel"));
0026
0027
0028 DigiToken_ = consumes<DTDigiCollection>(pset.getParameter<edm::InputTag>(("DigiLabel")));
0029
0030 hDigis_global = std::make_unique<hDigis>("Global");
0031 hDigis_W0 = std::make_unique<hDigis>("Wheel0");
0032 hDigis_W1 = std::make_unique<hDigis>("Wheel1");
0033 hDigis_W2 = std::make_unique<hDigis>("Wheel2");
0034 hAllHits = std::make_unique<hHits>("AllHits");
0035 }
0036
0037 MuonDTDigis::~MuonDTDigis() {
0038 if (verbose_)
0039 cout << "[MuonDTDigis] Destructor called" << endl;
0040 }
0041
0042 void MuonDTDigis::bookHistograms(DQMStore::IBooker &iBooker,
0043 edm::Run const &iRun,
0044 edm::EventSetup const & ) {
0045 meDigiTimeBox_ = nullptr;
0046 meDigiTimeBox_wheel2m_ = nullptr;
0047 meDigiTimeBox_wheel1m_ = nullptr;
0048 meDigiTimeBox_wheel0_ = nullptr;
0049 meDigiTimeBox_wheel1p_ = nullptr;
0050 meDigiTimeBox_wheel2p_ = nullptr;
0051 meDigiEfficiency_ = nullptr;
0052 meDigiEfficiencyMu_ = nullptr;
0053 meDoubleDigi_ = nullptr;
0054 meSimvsDigi_ = nullptr;
0055 meWire_DoubleDigi_ = nullptr;
0056
0057 meMB1_sim_occup_ = nullptr;
0058 meMB1_digi_occup_ = nullptr;
0059 meMB2_sim_occup_ = nullptr;
0060 meMB2_digi_occup_ = nullptr;
0061 meMB3_sim_occup_ = nullptr;
0062 meMB3_digi_occup_ = nullptr;
0063 meMB4_sim_occup_ = nullptr;
0064 meMB4_digi_occup_ = nullptr;
0065
0066 meDigiHisto_ = nullptr;
0067
0068
0069
0070
0071
0072 Char_t histo_n[100];
0073 Char_t histo_t[100];
0074
0075 iBooker.setCurrentFolder("MuonDTDigisV/DTDigiValidationTask");
0076
0077 sprintf(histo_n, "DigiTimeBox");
0078 sprintf(histo_t, "Digi Time Box");
0079 meDigiTimeBox_ = iBooker.book1D(histo_n, histo_t, 1536, 0, 1200);
0080
0081 sprintf(histo_n, "DigiTimeBox_wheel2m");
0082 sprintf(histo_t, "Digi Time Box wheel -2");
0083 meDigiTimeBox_wheel2m_ = iBooker.book1D(histo_n, histo_t, 384, 0, 1200);
0084
0085 sprintf(histo_n, "DigiTimeBox_wheel1m");
0086 sprintf(histo_t, "Digi Time Box wheel -1");
0087 meDigiTimeBox_wheel1m_ = iBooker.book1D(histo_n, histo_t, 384, 0, 1200);
0088
0089 sprintf(histo_n, "DigiTimeBox_wheel0");
0090 sprintf(histo_t, "Digi Time Box wheel 0");
0091 meDigiTimeBox_wheel0_ = iBooker.book1D(histo_n, histo_t, 384, 0, 1200);
0092
0093 sprintf(histo_n, "DigiTimeBox_wheel1p");
0094 sprintf(histo_t, "Digi Time Box wheel 1");
0095 meDigiTimeBox_wheel1p_ = iBooker.book1D(histo_n, histo_t, 384, 0, 1200);
0096
0097 sprintf(histo_n, "DigiTimeBox_wheel2p");
0098 sprintf(histo_t, "Digi Time Box wheel 2");
0099 meDigiTimeBox_wheel2p_ = iBooker.book1D(histo_n, histo_t, 384, 0, 1200);
0100
0101 sprintf(histo_n, "DigiEfficiencyMu");
0102 sprintf(histo_t, "Ratio (#Digis Mu)/(#SimHits Mu)");
0103 meDigiEfficiencyMu_ = iBooker.book1D(histo_n, histo_t, 100, 0., 5.);
0104
0105 sprintf(histo_n, "DigiEfficiency");
0106 sprintf(histo_t, "Ratio (#Digis)/(#SimHits)");
0107 meDigiEfficiency_ = iBooker.book1D(histo_n, histo_t, 100, 0., 5.);
0108
0109 sprintf(histo_n, "Number_Digi_per_layer");
0110 sprintf(histo_t, "Number_Digi_per_layer");
0111 meDoubleDigi_ = iBooker.book1D(histo_n, histo_t, 10, 0., 10.);
0112
0113 sprintf(histo_n, "Number_simhit_vs_digi");
0114 sprintf(histo_t, "Number_simhit_vs_digi");
0115 meSimvsDigi_ = iBooker.book2D(histo_n, histo_t, 100, 0., 140., 100, 0., 140.);
0116
0117 sprintf(histo_n, "Wire_Number_with_double_Digi");
0118 sprintf(histo_t, "Wire_Number_with_double_Digi");
0119 meWire_DoubleDigi_ = iBooker.book1D(histo_n, histo_t, 100, 0., 100.);
0120
0121 sprintf(histo_n, "Simhit_occupancy_MB1");
0122 sprintf(histo_t, "Simhit_occupancy_MB1");
0123 meMB1_sim_occup_ = iBooker.book1D(histo_n, histo_t, 55, 0., 55.);
0124
0125 sprintf(histo_n, "Digi_occupancy_MB1");
0126 sprintf(histo_t, "Digi_occupancy_MB1");
0127 meMB1_digi_occup_ = iBooker.book1D(histo_n, histo_t, 55, 0., 55.);
0128
0129 sprintf(histo_n, "Simhit_occupancy_MB2");
0130 sprintf(histo_t, "Simhit_occupancy_MB2");
0131 meMB2_sim_occup_ = iBooker.book1D(histo_n, histo_t, 63, 0., 63.);
0132
0133 sprintf(histo_n, "Digi_occupancy_MB2");
0134 sprintf(histo_t, "Digi_occupancy_MB2");
0135 meMB2_digi_occup_ = iBooker.book1D(histo_n, histo_t, 63, 0., 63.);
0136
0137 sprintf(histo_n, "Simhit_occupancy_MB3");
0138 sprintf(histo_t, "Simhit_occupancy_MB3");
0139 meMB3_sim_occup_ = iBooker.book1D(histo_n, histo_t, 75, 0., 75.);
0140
0141 sprintf(histo_n, "Digi_occupancy_MB3");
0142 sprintf(histo_t, "Digi_occupancy_MB3");
0143 meMB3_digi_occup_ = iBooker.book1D(histo_n, histo_t, 75, 0., 75.);
0144
0145 sprintf(histo_n, "Simhit_occupancy_MB4");
0146 sprintf(histo_t, "Simhit_occupancy_MB4");
0147 meMB4_sim_occup_ = iBooker.book1D(histo_n, histo_t, 99, 0., 99.);
0148
0149 sprintf(histo_n, "Digi_occupancy_MB4");
0150 sprintf(histo_t, "Digi_occupancy_MB4");
0151 meMB4_digi_occup_ = iBooker.book1D(histo_n, histo_t, 99, 0., 99.);
0152
0153
0154 char stringcham[40];
0155 for (int slnum = 1; slnum < 62; ++slnum) {
0156 sprintf(stringcham, "DigiTimeBox_slid_%d", slnum);
0157 meDigiHisto_ = iBooker.book1D(stringcham, stringcham, 100, 0, 1200);
0158 meDigiTimeBox_SL_.push_back(meDigiHisto_);
0159 }
0160 }
0161
0162 void MuonDTDigis::analyze(const Event &event, const EventSetup &eventSetup) {
0163 if (verbose_)
0164 cout << "--- [MuonDTDigis] Analysing Event: #Run: " << event.id().run() << " #Event: " << event.id().event()
0165 << endl;
0166
0167
0168 muonGeom = &eventSetup.getData(muonGeomToken_);
0169
0170
0171 Handle<DTDigiCollection> dtDigis;
0172 event.getByToken(DigiToken_, dtDigis);
0173
0174
0175 Handle<PSimHitContainer> simHits;
0176 event.getByToken(SimHitToken_, simHits);
0177
0178 int num_mudigis;
0179 int num_musimhits;
0180 int num_digis;
0181 int num_digis_layer;
0182 int cham_num;
0183 int wire_touched;
0184 num_digis = 0;
0185 num_mudigis = 0;
0186 num_musimhits = 0;
0187 DTWireIdMap wireMap;
0188
0189 for (vector<PSimHit>::const_iterator hit = simHits->begin(); hit != simHits->end(); hit++) {
0190
0191 DTWireId wireId(hit->detUnitId());
0192
0193
0194
0195
0196 wireMap[wireId].push_back(&(*hit));
0197
0198 LocalPoint entryP = hit->entryPoint();
0199 LocalPoint exitP = hit->exitPoint();
0200 int partType = hit->particleType();
0201 if (abs(partType) == 13)
0202 num_musimhits++;
0203
0204 if (wireId.station() == 1 && abs(partType) == 13)
0205 meMB1_sim_occup_->Fill(wireId.wire());
0206 if (wireId.station() == 2 && abs(partType) == 13)
0207 meMB2_sim_occup_->Fill(wireId.wire());
0208 if (wireId.station() == 3 && abs(partType) == 13)
0209 meMB3_sim_occup_->Fill(wireId.wire());
0210 if (wireId.station() == 4 && abs(partType) == 13)
0211 meMB4_sim_occup_->Fill(wireId.wire());
0212
0213 float path = (exitP - entryP).mag();
0214 float path_x = fabs((exitP - entryP).x());
0215
0216 hAllHits->Fill(entryP.x(),
0217 exitP.x(),
0218 entryP.y(),
0219 exitP.y(),
0220 entryP.z(),
0221 exitP.z(),
0222 path,
0223 path_x,
0224 partType,
0225 hit->processType(),
0226 hit->pabs());
0227 }
0228
0229
0230
0231 DTDigiCollection::DigiRangeIterator detUnitIt;
0232 for (detUnitIt = dtDigis->begin(); detUnitIt != dtDigis->end(); ++detUnitIt) {
0233 const DTLayerId &id = (*detUnitIt).first;
0234 const DTDigiCollection::Range &range = (*detUnitIt).second;
0235
0236 num_digis_layer = 0;
0237 cham_num = 0;
0238 wire_touched = 0;
0239
0240
0241 for (DTDigiCollection::const_iterator digiIt = range.first; digiIt != range.second; ++digiIt) {
0242
0243
0244
0245 num_digis++;
0246 num_digis_layer++;
0247 if (num_digis_layer > 1) {
0248 if ((*digiIt).wire() == wire_touched) {
0249 meWire_DoubleDigi_->Fill((*digiIt).wire());
0250
0251
0252 }
0253 }
0254 wire_touched = (*digiIt).wire();
0255
0256 meDigiTimeBox_->Fill((*digiIt).time());
0257 if (id.wheel() == -2)
0258 meDigiTimeBox_wheel2m_->Fill((*digiIt).time());
0259 if (id.wheel() == -1)
0260 meDigiTimeBox_wheel1m_->Fill((*digiIt).time());
0261 if (id.wheel() == 0)
0262 meDigiTimeBox_wheel0_->Fill((*digiIt).time());
0263 if (id.wheel() == 1)
0264 meDigiTimeBox_wheel1p_->Fill((*digiIt).time());
0265 if (id.wheel() == 2)
0266 meDigiTimeBox_wheel2p_->Fill((*digiIt).time());
0267
0268
0269
0270 cham_num = (id.wheel() + 2) * 12 + (id.station() - 1) * 3 + id.superlayer();
0271
0272
0273 meDigiTimeBox_SL_[cham_num]->Fill((*digiIt).time());
0274
0275
0276
0277 DTWireId wireId(id, (*digiIt).wire());
0278 if (wireId.station() == 1)
0279 meMB1_digi_occup_->Fill((*digiIt).wire());
0280 if (wireId.station() == 2)
0281 meMB2_digi_occup_->Fill((*digiIt).wire());
0282 if (wireId.station() == 3)
0283 meMB3_digi_occup_->Fill((*digiIt).wire());
0284 if (wireId.station() == 4)
0285 meMB4_digi_occup_->Fill((*digiIt).wire());
0286
0287 int mu = 0;
0288 float theta = 0;
0289
0290 for (vector<const PSimHit *>::iterator hit = wireMap[wireId].begin(); hit != wireMap[wireId].end(); hit++)
0291 if (abs((*hit)->particleType()) == 13) {
0292 theta = atan((*hit)->momentumAtEntry().x() / (-(*hit)->momentumAtEntry().z())) * 180 / M_PI;
0293
0294
0295
0296 mu++;
0297 }
0298
0299 if (mu)
0300 num_mudigis++;
0301
0302 if (mu && theta) {
0303 hDigis_global->Fill((*digiIt).time(), theta, id.superlayer());
0304
0305 WheelHistos(id.wheel())->Fill((*digiIt).time(), theta, id.superlayer());
0306 }
0307
0308 }
0309
0310 meDoubleDigi_->Fill((float)num_digis_layer);
0311
0312 }
0313
0314
0315
0316 if (num_musimhits != 0) {
0317 meDigiEfficiencyMu_->Fill((float)num_mudigis / (float)num_musimhits);
0318 meDigiEfficiency_->Fill((float)num_digis / (float)num_musimhits);
0319 }
0320
0321 meSimvsDigi_->Fill((float)num_musimhits, (float)num_digis);
0322
0323 }
0324
0325 hDigis *MuonDTDigis::WheelHistos(int wheel) {
0326 switch (abs(wheel)) {
0327 case 0:
0328 return hDigis_W0.get();
0329
0330 case 1:
0331 return hDigis_W1.get();
0332
0333 case 2:
0334 return hDigis_W2.get();
0335
0336 default:
0337 return nullptr;
0338 }
0339 }
0340 #include "DQMServices/Core/interface/DQMStore.h"
0341 #include "FWCore/Framework/interface/MakerMacros.h"
0342 #include "FWCore/PluginManager/interface/ModuleDef.h"
0343
0344 DEFINE_FWK_MODULE(MuonDTDigis);