95 MonitorElement *h_numRPWithTrack_top=
nullptr, *h_numRPWithTrack_hor=
nullptr, *h_numRPWithTrack_bot=
nullptr;
117 MonitorElement *vfat_problem=
nullptr, *vfat_missing=
nullptr, *vfat_ec_bc_error=
nullptr, *vfat_corruption=
nullptr;
167 h_trackCorr_hor = ibooker.
book2D(
"track correlation RP-210-hor",
"rp, 210, hor", 4, -0.5, 3.5, 4, -0.5, 3.5);
169 TAxis *xa = hist->GetXaxis(), *ya = hist->GetYaxis();
170 xa->SetBinLabel(1,
"45, 210, near"); ya->SetBinLabel(1,
"45, 210, near");
171 xa->SetBinLabel(2,
"45, 210, far"); ya->SetBinLabel(2,
"45, 210, far");
172 xa->SetBinLabel(3,
"56, 210, near"); ya->SetBinLabel(3,
"56, 210, near");
173 xa->SetBinLabel(4,
"56, 210, far"); ya->SetBinLabel(4,
"56, 210, far");
182 bool diag = (top45 != top56);
185 sprintf(name,
"%s 45%s - 56%s",
186 (diag) ?
"diagonal" :
"antidiagonal",
187 (top45) ?
"top" :
"bot",
188 (top56) ?
"top" :
"bot" 194 h_lrc_x_d = ibooker.
book2D(
"dx left vs right",
string(name) +
" : dx left vs. right, histogram;#Delta x_{45};#Delta x_{56}", 50, 0., 0., 50, 0., 0.);
195 h_lrc_x_n = ibooker.
book2D(
"xn left vs right",
string(name) +
" : xn left vs. right, histogram;x^{N}_{45};x^{N}_{56}", 50, 0., 0., 50, 0., 0.);
196 h_lrc_x_f = ibooker.
book2D(
"xf left vs right",
string(name) +
" : xf left vs. right, histogram;x^{F}_{45};x^{F}_{56}", 50, 0., 0., 50, 0., 0.);
198 h_lrc_y_d = ibooker.
book2D(
"dy left vs right",
string(name) +
" : dy left vs. right, histogram;#Delta y_{45};#Delta y_{56}", 50, 0., 0., 50, 0., 0.);
199 h_lrc_y_n = ibooker.
book2D(
"yn left vs right",
string(name) +
" : yn left vs. right, histogram;y^{N}_{45};y^{N}_{56}", 50, 0., 0., 50, 0., 0.);
200 h_lrc_y_f = ibooker.
book2D(
"yf left vs right",
string(name) +
" : yf left vs. right, histogram;y^{F}_{45};y^{F}_{56}", 50, 0., 0., 50, 0., 0.);
218 h_trackCorr = ibooker.
book2D(
"track RP correlation", title, 13, -0.5, 12.5, 13, -0.5, 12.5);
220 TAxis *xa = h_trackCorr_h->GetXaxis(), *ya = h_trackCorr_h->GetYaxis();
221 xa->SetBinLabel(1,
"210, near, top"); ya->SetBinLabel(1,
"210, near, top");
222 xa->SetBinLabel(2,
"bot"); ya->SetBinLabel(2,
"bot");
223 xa->SetBinLabel(3,
"hor"); ya->SetBinLabel(3,
"hor");
224 xa->SetBinLabel(4,
"far, hor"); ya->SetBinLabel(4,
"far, hor");
225 xa->SetBinLabel(5,
"top"); ya->SetBinLabel(5,
"top");
226 xa->SetBinLabel(6,
"bot"); ya->SetBinLabel(6,
"bot");
227 xa->SetBinLabel(8,
"220, near, top"); ya->SetBinLabel(8,
"220, near, top");
228 xa->SetBinLabel(9,
"bot"); ya->SetBinLabel(9,
"bot");
229 xa->SetBinLabel(10,
"hor"); ya->SetBinLabel(10,
"hor");
230 xa->SetBinLabel(11,
"far, hor"); ya->SetBinLabel(11,
"far, hor");
231 xa->SetBinLabel(12,
"top"); ya->SetBinLabel(12,
"top");
232 xa->SetBinLabel(13,
"bot"); ya->SetBinLabel(13,
"bot");
236 xa = h_trackCorr_h->GetXaxis(); ya = h_trackCorr_h->GetYaxis();
237 xa->SetBinLabel(1,
"210, near, top"); ya->SetBinLabel(1,
"210, near, top");
238 xa->SetBinLabel(2,
"bot"); ya->SetBinLabel(2,
"bot");
239 xa->SetBinLabel(3,
"hor"); ya->SetBinLabel(3,
"hor");
240 xa->SetBinLabel(4,
"far, hor"); ya->SetBinLabel(4,
"far, hor");
241 xa->SetBinLabel(5,
"top"); ya->SetBinLabel(5,
"top");
242 xa->SetBinLabel(6,
"bot"); ya->SetBinLabel(6,
"bot");
243 xa->SetBinLabel(8,
"220, near, top"); ya->SetBinLabel(8,
"220, near, top");
244 xa->SetBinLabel(9,
"bot"); ya->SetBinLabel(9,
"bot");
245 xa->SetBinLabel(10,
"hor"); ya->SetBinLabel(10,
"hor");
246 xa->SetBinLabel(11,
"far, hor"); ya->SetBinLabel(11,
"far, hor");
247 xa->SetBinLabel(12,
"top"); ya->SetBinLabel(12,
"top");
248 xa->SetBinLabel(13,
"bot"); ya->SetBinLabel(13,
"bot");
272 vfat_problem = ibooker.
book2D(
"vfats with any problem", title+
";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
273 vfat_missing = ibooker.
book2D(
"vfats missing", title+
";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
274 vfat_ec_bc_error = ibooker.
book2D(
"vfats with EC or BC error", title+
";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
275 vfat_corruption = ibooker.
book2D(
"vfats with data corruption", title+
";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
277 activity = ibooker.
book1D(
"active planes", title+
";number of active planes", 11, -0.5, 10.5);
278 activity_u = ibooker.
book1D(
"active planes U", title+
";number of active U planes", 11, -0.5, 10.5);
279 activity_v = ibooker.
book1D(
"active planes V", title+
";number of active V planes", 11, -0.5, 10.5);
281 activity_per_bx = ibooker.
book1D(
"activity per BX", title+
";Event.BX", 4002, -1.5, 4000. + 0.5);
282 activity_per_bx_short = ibooker.
book1D(
"activity per BX (short)", title+
";Event.BX", 102, -1.5, 100. + 0.5);
284 hit_plane_hist = ibooker.
book2D(
"activity in planes (2D)", title+
";plane number;strip number", 10, -0.5, 9.5, 32, -0.5, 511.5);
286 patterns_u = ibooker.
book1D(
"recognized patterns U", title+
";number of recognized U patterns", 11, -0.5, 10.5);
287 patterns_v = ibooker.
book1D(
"recognized patterns V", title+
";number of recognized V patterns", 11, -0.5, 10.5);
289 h_planes_fit_u = ibooker.
book1D(
"planes contributing to fit U", title+
";number of planes contributing to U fit", 6, -0.5, 5.5);
290 h_planes_fit_v = ibooker.
book1D(
"planes contributing to fit V", title+
";number of planes contributing to V fit", 6, -0.5, 5.5);
292 event_category = ibooker.
book1D(
"event category", title+
";event category", 5, -0.5, 4.5);
293 TH1F *event_category_h = event_category->
getTH1F();
294 event_category_h->GetXaxis()->SetBinLabel(1,
"empty");
295 event_category_h->GetXaxis()->SetBinLabel(2,
"insufficient");
296 event_category_h->GetXaxis()->SetBinLabel(3,
"single-track");
297 event_category_h->GetXaxis()->SetBinLabel(4,
"multi-track");
298 event_category_h->GetXaxis()->SetBinLabel(5,
"shower");
300 trackHitsCumulativeHist = ibooker.
book2D(
"track XY profile", title+
";x (mm);y (mm)", 100, -18., +18., 100, -18., +18.);
302 track_u_profile = ibooker.
book1D(
"track profile U", title+
"; U (mm)", 512, -256*66E-3, +256*66E-3);
303 track_v_profile = ibooker.
book1D(
"track profile V", title+
"; V (mm)", 512, -256*66E-3, +256*66E-3);
318 digi_profile_cumulative = ibooker.
book1D(
"digi profile", title+
";strip number", 512, -0.5, 511.5);
319 cluster_profile_cumulative = ibooker.
book1D(
"cluster profile", title+
";cluster center", 1024, -0.25, 511.75);
320 hit_multiplicity = ibooker.
book1D(
"hit multiplicity", title+
";hits/detector/event", 6, -0.5, 5.5);
321 cluster_size = ibooker.
book1D(
"cluster size", title+
";hits per cluster", 5, 0.5, 5.5);
323 efficiency_num = ibooker.
book1D(
"efficiency num", title+
";track position (mm)", 30, -15., 0.);
324 efficiency_den = ibooker.
book1D(
"efficiency den", title+
";track position (mm)", 30, -15., 0.);
331 verbosity(ps.getUntrackedParameter<unsigned
int>(
"verbosity", 0))
377 for (
unsigned int arm = 0; arm < 2; arm++)
383 for (
unsigned int st = 0; st < 3; st += 2)
389 for (
unsigned int rp = 0; rp < 6; ++rp)
406 for (
unsigned int pl = 0; pl < 10; ++pl)
468 "ERROR in TotemDQMModuleRP::analyze > some of the required inputs are not valid. Skipping this event.\n" 469 <<
" status.isValid = " << status.
isValid() <<
"\n" 470 <<
" digi.isValid = " << digi.
isValid() <<
"\n" 471 <<
" digCluster.isValid = " << digCluster.
isValid() <<
"\n" 472 <<
" hits.isValid = " << hits.
isValid() <<
"\n" 473 <<
" patterns.isValid = " << patterns.
isValid() <<
"\n" 474 <<
" tracks.isValid = " << tracks.
isValid();
487 for (
auto &ds1 : *tracks)
489 for (
auto &tr1 : ds1)
495 unsigned int arm1 = rpId1.
arm();
496 unsigned int stNum1 = rpId1.station();
497 unsigned int rpNum1 = rpId1.rp();
498 if (stNum1 != 0 || (rpNum1 != 2 && rpNum1 != 3))
500 unsigned int idx1 = arm1*2 + rpNum1-2;
502 for (
auto &ds2 : *tracks)
504 for (
auto &tr2 : ds2)
510 unsigned int arm2 = rpId2.
arm();
511 unsigned int stNum2 = rpId2.station();
512 unsigned int rpNum2 = rpId2.rp();
513 if (stNum2 != 0 || (rpNum2 != 2 && rpNum2 != 3))
515 unsigned int idx2 = arm2*2 + rpNum2-2;
526 for (
auto &ds : *status)
529 unsigned int plNum = detId.
plane();
538 plots.vfat_problem->Fill(plNum,
s.getChipPosition());
539 plots.vfat_missing->Fill(plNum,
s.getChipPosition());
542 if (
s.isECProgressError() ||
s.isBCProgressError())
544 plots.vfat_problem->Fill(plNum,
s.getChipPosition());
545 plots.vfat_ec_bc_error->Fill(plNum,
s.getChipPosition());
548 if (
s.isIDMismatch() ||
s.isFootprintError() ||
s.isCRCError())
550 plots.vfat_problem->Fill(plNum,
s.getChipPosition());
551 plots.vfat_corruption->Fill(plNum,
s.getChipPosition());
564 planePlots[detId].digi_profile_cumulative->Fill(dit->getStripNumber());
572 planePlots[detId].cluster_profile_cumulative->Fill(dit->getCenterStripPosition());
579 planePlots[detId].hit_multiplicity->Fill(it->size());
587 planePlots[detId].cluster_size->Fill(dit->getNumberOfStrips());
591 for (
auto &ds : *tracks)
602 for (
unsigned int plNum = 0; plNum < 10; ++plNum)
607 double ft_z = ft.getZ0();
608 double ft_x = ft.getX0() + ft.getTx() * (ft_z - rp_z);
609 double ft_y = ft.getY0() + ft.getTy() * (ft_z - rp_z);
611 double ft_v = geometry->
globalToLocal(plId, CLHEP::Hep3Vector(ft_x, ft_y, ft_z)).y();
613 bool hasMatchingHit =
false;
614 const auto &hit_ds_it = hits->find(plId);
615 if (hit_ds_it != hits->end())
617 for (
const auto &
h : *hit_ds_it)
619 bool match = (fabs(ft_v -
h.getPosition()) < 2.*0.066);
622 hasMatchingHit =
true;
630 pp.efficiency_den->Fill(ft_v);
632 pp.efficiency_num->Fill(ft_v);
642 map<unsigned int, set<unsigned int> > planes;
643 map<unsigned int, set<unsigned int> > planes_u;
644 map<unsigned int, set<unsigned int> > planes_v;
645 for (
const auto &ds : *hits)
651 unsigned int planeNum = detId.
plane();
654 planes[rpId].insert(planeNum);
655 if (detId.isStripsCoordinateUDirection())
656 planes_u[rpId].
insert(planeNum);
658 planes_v[rpId].insert(planeNum);
661 for (
const auto &ds : *status)
663 bool activity =
false;
664 for (
const auto &
s : ds)
666 if (
s.isNumberOfClustersSpecified() &&
s.getNumberOfClusters() > 0)
677 unsigned int planeNum = detId.
plane();
680 planes[rpId].insert(planeNum);
681 if (detId.isStripsCoordinateUDirection())
682 planes_u[rpId].
insert(planeNum);
684 planes_v[rpId].insert(planeNum);
688 for (std::map<unsigned int, PotPlots>::iterator it =
potPlots.begin(); it !=
potPlots.end(); it++)
690 it->second.activity->Fill(planes[it->first].size());
691 it->second.activity_u->Fill(planes_u[it->first].size());
692 it->second.activity_v->Fill(planes_v[it->first].size());
694 if (planes[it->first].size() >= 6)
697 it->second.activity_per_bx_short->Fill(event.
bunchCrossing());
704 unsigned int planeNum = detId.
plane();
713 for (
auto &ds : *patterns)
720 unsigned int u = 0,
v = 0;
723 if (!
p.getFittable())
733 pp.patterns_u->Fill(u);
734 pp.patterns_v->Fill(
v);
741 auto &
pp = it.second;
744 unsigned int pl_u = planes_u[rpId].size();
745 unsigned int pl_v = planes_v[rpId].size();
748 const auto &rp_pat_it = patterns->find(rpId);
750 unsigned int pat_u = 0, pat_v = 0;
751 if (rp_pat_it != patterns->end())
753 for (
auto &
p : *rp_pat_it)
755 if (!
p.getFittable())
769 if (pl_u == 0 && pl_v == 0) category = 0;
771 if (category == -1 && pat_u + pat_v <= 1)
779 if (pat_u == 1 && pat_v == 1) category = 2;
781 if (category == -1) category = 3;
783 pp.event_category->Fill(category);
787 for (
auto &ds : *tracks)
799 unsigned int n_pl_in_fit_u = 0, n_pl_in_fit_v = 0;
800 for (
auto &hds : ft.getHits())
815 pp.h_planes_fit_u->Fill(n_pl_in_fit_u);
816 pp.h_planes_fit_v->Fill(n_pl_in_fit_v);
831 double x = ft.getX0() - rp_x;
832 double y = ft.getY0() - rp_y;
834 pp.trackHitsCumulativeHist->Fill(x, y);
836 double U = x * rod_U.x() + y * rod_U.y();
837 double V = x * rod_V.x() + y * rod_V.y();
839 pp.track_u_profile->Fill(U);
840 pp.track_v_profile->Fill(V);
851 map<unsigned int, unsigned int>
mTop, mHor, mBot;
860 for (
auto &ds : *tracks)
863 unsigned int rpNum = rpId.
rp();
871 if (rpNum == 0 || rpNum == 4)
873 if (rpNum == 2 || rpNum == 3)
875 if (rpNum == 1 || rpNum == 5)
880 for (
auto &
p : armPlots)
882 p.second.h_numRPWithTrack_top->Fill(mTop[
p.first]);
883 p.second.h_numRPWithTrack_hor->Fill(mHor[
p.first]);
884 p.second.h_numRPWithTrack_bot->Fill(mBot[
p.first]);
888 for (
auto &ds1 : *tracks)
890 for (
auto &tr1 : ds1)
896 unsigned int arm1 = rpId1.
arm();
897 unsigned int stNum1 = rpId1.station();
898 unsigned int rpNum1 = rpId1.rp();
899 unsigned int idx1 = stNum1/2 * 7 + rpNum1;
900 bool hor1 = (rpNum1 == 2 || rpNum1 == 3);
905 for (
auto &ds2 : *tracks)
907 for (
auto &tr2 : ds2)
913 unsigned int arm2 = rpId2.
arm();
914 unsigned int stNum2 = rpId2.station();
915 unsigned int rpNum2 = rpId2.rp();
916 unsigned int idx2 = stNum2/2 * 7 + rpNum2;
917 bool hor2 = (rpNum2 == 2 || rpNum2 == 3);
Detector ID class for TOTEM Si strip detectors.
T getParameter(std::string const &) const
MonitorElement * h_lrc_x_n
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
void Init(DQMStore::IBooker &ibooker)
MonitorElement * h_trackCorr_overlap
#define DEFINE_FWK_MODULE(type)
std::map< unsigned int, ArmPlots > armPlots
int bunchCrossing() const
MonitorElement * events_per_bx
MonitorElement * h_lrc_x_f
void endRun(edm::Run const &run, edm::EventSetup const &eSetup) override
bool isStripsCoordinateUDirection() const
MonitorElement * h_trackCorr
edm::EDGetTokenT< edm::DetSetVector< TotemRPDigi > > tokenDigi
MonitorElement * h_lrc_y_d
Event setup record containing the real (actual) geometry information.
MonitorElement * h_numRPWithTrack_top
plots related to one RP plane
std::map< unsigned int, PlanePlots > planePlots
MonitorElement * h_numRPWithTrack_hor
edm::EDGetTokenT< edm::DetSetVector< TotemRPRecHit > > tokenRecHit
MonitorElement * h_lrc_y_f
const DetGeomDesc * getSensor(unsigned int id) const
returns geometry of a detector performs necessary checks, returns NULL if fails
plots related to one (anti)diagonal
void beginLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &eSetup) override
~TotemRPDQMSource() override
edm::EDGetTokenT< edm::DetSetVector< TotemRPUVPattern > > tokenUVPattern
MonitorElement * h_numRPWithTrack_bot
MonitorElement * book1D(Args &&...args)
MonitorElement * h_trackCorr_hor
DDTranslation translation() const
void rpName(std::string &name, NameFlag flag=nFull) const
CTPPSDetId getRPId() const
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
MonitorElement * events_per_bx_short
void armName(std::string &name, NameFlag flag=nFull) const
plots related to one station
CLHEP::Hep3Vector getRPTranslation(unsigned int id) const
edm::EDGetTokenT< edm::DetSetVector< TotemRPCluster > > tokenCluster
MonitorElement * hit_plane_hist
std::map< unsigned int, StationPlots > stationPlots
void setCurrentFolder(const std::string &fullpath)
CTPPSDetId getArmId() const
MonitorElement * book2D(Args &&...args)
CLHEP::Hep3Vector localToGlobalDirection(unsigned int id, const CLHEP::Hep3Vector &) const
void setPlane(uint32_t det)
void endLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &eSetup) override
TH1F * getTH1F(void) const
MonitorElement * h_lrc_x_d
Base class for CTPPS detector IDs.
TotemRPDQMSource(const edm::ParameterSet &ps)
ESHandle< TrackerGeometry > geometry
void stationName(std::string &name, NameFlag flag=nFull) const
std::map< unsigned int, PotPlots > potPlots
void planeName(std::string &name, NameFlag flag=nFull) const
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
plots related to the whole system
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
std::map< unsigned int, DiagonalPlots > diagonalPlots
TH2F * getTH2F(void) const
CLHEP::Hep3Vector globalToLocal(const DetGeomDesc *, const CLHEP::Hep3Vector &) const
MonitorElement * h_lrc_y_n
edm::EDGetTokenT< edm::DetSetVector< TotemRPLocalTrack > > tokenLocalTrack
edm::EDGetTokenT< edm::DetSetVector< TotemVFATStatus > > tokenStatus