162 events_per_bx = ibooker.
book1D(
"events per BX",
"rp;Event.BX", 4002, -1.5, 4000. + 0.5);
163 events_per_bx_short = ibooker.
book1D(
"events per BX (short)",
"rp;Event.BX", 102, -1.5, 100. + 0.5);
165 h_trackCorr_hor = ibooker.
book2D(
"track correlation RP-210-hor",
"rp, 210, hor", 4, -0.5, 3.5, 4, -0.5, 3.5);
166 TH2F *
hist = h_trackCorr_hor->getTH2F();
167 TAxis *xa = hist->GetXaxis(), *ya = hist->GetYaxis();
168 xa->SetBinLabel(1,
"45, 210, near"); ya->SetBinLabel(1,
"45, 210, near");
169 xa->SetBinLabel(2,
"45, 210, far"); ya->SetBinLabel(2,
"45, 210, far");
170 xa->SetBinLabel(3,
"56, 210, near"); ya->SetBinLabel(3,
"56, 210, near");
171 xa->SetBinLabel(4,
"56, 210, far"); ya->SetBinLabel(4,
"56, 210, far");
180 bool diag = (top45 != top56);
183 sprintf(name,
"%s 45%s - 56%s",
184 (diag) ?
"diagonal" :
"antidiagonal",
185 (top45) ?
"top" :
"bot",
186 (top56) ?
"top" :
"bot"
192 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.);
193 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.);
194 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.);
196 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.);
197 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.);
198 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.);
216 h_trackCorr = ibooker.
book2D(
"track RP correlation", title, 13, -0.5, 12.5, 13, -0.5, 12.5);
218 TAxis *xa = h_trackCorr_h->GetXaxis(), *ya = h_trackCorr_h->GetYaxis();
219 xa->SetBinLabel(1,
"210, near, top"); ya->SetBinLabel(1,
"210, near, top");
220 xa->SetBinLabel(2,
"bot"); ya->SetBinLabel(2,
"bot");
221 xa->SetBinLabel(3,
"hor"); ya->SetBinLabel(3,
"hor");
222 xa->SetBinLabel(4,
"far, hor"); ya->SetBinLabel(4,
"far, hor");
223 xa->SetBinLabel(5,
"top"); ya->SetBinLabel(5,
"top");
224 xa->SetBinLabel(6,
"bot"); ya->SetBinLabel(6,
"bot");
225 xa->SetBinLabel(8,
"220, near, top"); ya->SetBinLabel(8,
"220, near, top");
226 xa->SetBinLabel(9,
"bot"); ya->SetBinLabel(9,
"bot");
227 xa->SetBinLabel(10,
"hor"); ya->SetBinLabel(10,
"hor");
228 xa->SetBinLabel(11,
"far, hor"); ya->SetBinLabel(11,
"far, hor");
229 xa->SetBinLabel(12,
"top"); ya->SetBinLabel(12,
"top");
230 xa->SetBinLabel(13,
"bot"); ya->SetBinLabel(13,
"bot");
234 xa = h_trackCorr_h->GetXaxis(); ya = h_trackCorr_h->GetYaxis();
235 xa->SetBinLabel(1,
"210, near, top"); ya->SetBinLabel(1,
"210, near, top");
236 xa->SetBinLabel(2,
"bot"); ya->SetBinLabel(2,
"bot");
237 xa->SetBinLabel(3,
"hor"); ya->SetBinLabel(3,
"hor");
238 xa->SetBinLabel(4,
"far, hor"); ya->SetBinLabel(4,
"far, hor");
239 xa->SetBinLabel(5,
"top"); ya->SetBinLabel(5,
"top");
240 xa->SetBinLabel(6,
"bot"); ya->SetBinLabel(6,
"bot");
241 xa->SetBinLabel(8,
"220, near, top"); ya->SetBinLabel(8,
"220, near, top");
242 xa->SetBinLabel(9,
"bot"); ya->SetBinLabel(9,
"bot");
243 xa->SetBinLabel(10,
"hor"); ya->SetBinLabel(10,
"hor");
244 xa->SetBinLabel(11,
"far, hor"); ya->SetBinLabel(11,
"far, hor");
245 xa->SetBinLabel(12,
"top"); ya->SetBinLabel(12,
"top");
246 xa->SetBinLabel(13,
"bot"); ya->SetBinLabel(13,
"bot");
270 vfat_problem = ibooker.
book2D(
"vfats with any problem", title+
";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
271 vfat_missing = ibooker.
book2D(
"vfats missing", title+
";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
272 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);
273 vfat_corruption = ibooker.
book2D(
"vfats with data corruption", title+
";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
275 activity = ibooker.
book1D(
"active planes", title+
";number of active planes", 11, -0.5, 10.5);
276 activity_u = ibooker.
book1D(
"active planes U", title+
";number of active U planes", 11, -0.5, 10.5);
277 activity_v = ibooker.
book1D(
"active planes V", title+
";number of active V planes", 11, -0.5, 10.5);
279 activity_per_bx = ibooker.
book1D(
"activity per BX", title+
";Event.BX", 4002, -1.5, 4000. + 0.5);
280 activity_per_bx_short = ibooker.
book1D(
"activity per BX (short)", title+
";Event.BX", 102, -1.5, 100. + 0.5);
282 hit_plane_hist = ibooker.
book2D(
"activity in planes (2D)", title+
";plane number;strip number", 10, -0.5, 9.5, 32, -0.5, 511.5);
284 patterns_u = ibooker.
book1D(
"recognized patterns U", title+
";number of recognized U patterns", 11, -0.5, 10.5);
285 patterns_v = ibooker.
book1D(
"recognized patterns V", title+
";number of recognized V patterns", 11, -0.5, 10.5);
287 h_planes_fit_u = ibooker.
book1D(
"planes contributing to fit U", title+
";number of planes contributing to U fit", 6, -0.5, 5.5);
288 h_planes_fit_v = ibooker.
book1D(
"planes contributing to fit V", title+
";number of planes contributing to V fit", 6, -0.5, 5.5);
290 event_category = ibooker.
book1D(
"event category", title+
";event category", 5, -0.5, 4.5);
291 TH1F *event_category_h = event_category->
getTH1F();
292 event_category_h->GetXaxis()->SetBinLabel(1,
"empty");
293 event_category_h->GetXaxis()->SetBinLabel(2,
"insufficient");
294 event_category_h->GetXaxis()->SetBinLabel(3,
"single-track");
295 event_category_h->GetXaxis()->SetBinLabel(4,
"multi-track");
296 event_category_h->GetXaxis()->SetBinLabel(5,
"shower");
298 trackHitsCumulativeHist = ibooker.
book2D(
"track XY profile", title+
";x (mm);y (mm)", 100, -18., +18., 100, -18., +18.);
300 track_u_profile = ibooker.
book1D(
"track profile U", title+
"; U (mm)", 512, -256*66E-3, +256*66E-3);
301 track_v_profile = ibooker.
book1D(
"track profile V", title+
"; V (mm)", 512, -256*66E-3, +256*66E-3);
316 digi_profile_cumulative = ibooker.
book1D(
"digi profile", title+
";strip number", 512, -0.5, 511.5);
317 cluster_profile_cumulative = ibooker.
book1D(
"cluster profile", title+
";cluster center", 1024, -0.25, 511.75);
318 hit_multiplicity = ibooker.
book1D(
"hit multiplicity", title+
";hits/detector/event", 6, -0.5, 5.5);
319 cluster_size = ibooker.
book1D(
"cluster size", title+
";hits per cluster", 5, 0.5, 5.5);
321 efficiency_num = ibooker.
book1D(
"efficiency num", title+
";track position (mm)", 30, -15., 0.);
322 efficiency_den = ibooker.
book1D(
"efficiency den", title+
";track position (mm)", 30, -15., 0.);
329 verbosity(ps.getUntrackedParameter<unsigned int>(
"verbosity", 0))
375 for (
unsigned int arm = 0; arm < 2; arm++)
381 for (
unsigned int st = 0; st < 3; st += 2)
387 for (
unsigned int rp = 0; rp < 6; ++rp)
393 for (
unsigned int pl = 0; pl < 10; ++pl)
455 "ERROR in TotemDQMModuleRP::analyze > some of the required inputs are not valid. Skipping this event.\n"
456 <<
" status.isValid = " << status.
isValid() <<
"\n"
457 <<
" digi.isValid = " << digi.
isValid() <<
"\n"
458 <<
" digCluster.isValid = " << digCluster.
isValid() <<
"\n"
459 <<
" hits.isValid = " << hits.
isValid() <<
"\n"
460 <<
" patterns.isValid = " << patterns.
isValid() <<
"\n"
461 <<
" tracks.isValid = " << tracks.
isValid();
474 for (
auto &ds1 : *tracks)
476 for (
auto &tr1 : ds1)
482 unsigned int arm1 = rpId1.
arm();
483 unsigned int stNum1 = rpId1.station();
484 unsigned int rpNum1 = rpId1.rp();
485 if (stNum1 != 0 || (rpNum1 != 2 && rpNum1 != 3))
487 unsigned int idx1 = arm1*2 + rpNum1-2;
489 for (
auto &ds2 : *tracks)
491 for (
auto &tr2 : ds2)
497 unsigned int arm2 = rpId2.
arm();
498 unsigned int stNum2 = rpId2.station();
499 unsigned int rpNum2 = rpId2.rp();
500 if (stNum2 != 0 || (rpNum2 != 2 && rpNum2 != 3))
502 unsigned int idx2 = arm2*2 + rpNum2-2;
513 for (
auto &ds : *status)
516 unsigned int plNum = detId.
plane();
525 plots.vfat_problem->Fill(plNum,
s.getChipPosition());
526 plots.vfat_missing->Fill(plNum,
s.getChipPosition());
529 if (
s.isECProgressError() ||
s.isBCProgressError())
531 plots.vfat_problem->Fill(plNum,
s.getChipPosition());
532 plots.vfat_ec_bc_error->Fill(plNum,
s.getChipPosition());
535 if (
s.isIDMismatch() ||
s.isFootprintError() ||
s.isCRCError())
537 plots.vfat_problem->Fill(plNum,
s.getChipPosition());
538 plots.vfat_corruption->Fill(plNum,
s.getChipPosition());
551 planePlots[detId].digi_profile_cumulative->Fill(dit->getStripNumber());
559 planePlots[detId].cluster_profile_cumulative->Fill(dit->getCenterStripPosition());
566 planePlots[detId].hit_multiplicity->Fill(it->size());
574 planePlots[detId].cluster_size->Fill(dit->getNumberOfStrips());
578 for (
auto &ds : *tracks)
587 double rp_z = geometry->GetRPGlobalTranslation(rpId).z();
589 for (
unsigned int plNum = 0; plNum < 10; ++plNum)
594 double ft_z = ft.getZ0();
595 double ft_x = ft.getX0() + ft.getTx() * (ft_z - rp_z);
596 double ft_y = ft.getY0() + ft.getTy() * (ft_z - rp_z);
598 double ft_v = geometry->GlobalToLocal(plId, CLHEP::Hep3Vector(ft_x, ft_y, ft_z)).y();
600 bool hasMatchingHit =
false;
601 const auto &hit_ds_it = hits->find(plId);
602 if (hit_ds_it != hits->end())
604 for (
const auto &
h : *hit_ds_it)
606 bool match = (fabs(ft_v -
h.getPosition()) < 2.*0.066);
609 hasMatchingHit =
true;
617 pp.efficiency_den->Fill(ft_v);
619 pp.efficiency_num->Fill(ft_v);
629 map<unsigned int, set<unsigned int> > planes;
630 map<unsigned int, set<unsigned int> > planes_u;
631 map<unsigned int, set<unsigned int> > planes_v;
632 for (
const auto &ds : *hits)
638 unsigned int planeNum = detId.
plane();
641 planes[rpId].insert(planeNum);
642 if (detId.isStripsCoordinateUDirection())
643 planes_u[rpId].
insert(planeNum);
645 planes_v[rpId].insert(planeNum);
648 for (
const auto &ds : *status)
650 bool activity =
false;
651 for (
const auto &
s : ds)
653 if (
s.isNumberOfClustersSpecified() &&
s.getNumberOfClusters() > 0)
664 unsigned int planeNum = detId.
plane();
667 planes[rpId].insert(planeNum);
668 if (detId.isStripsCoordinateUDirection())
669 planes_u[rpId].
insert(planeNum);
671 planes_v[rpId].insert(planeNum);
675 for (std::map<unsigned int, PotPlots>::iterator it =
potPlots.begin(); it !=
potPlots.end(); it++)
677 it->second.activity->Fill(planes[it->first].size());
678 it->second.activity_u->Fill(planes_u[it->first].size());
679 it->second.activity_v->Fill(planes_v[it->first].size());
681 if (planes[it->first].size() >= 6)
684 it->second.activity_per_bx_short->Fill(event.
bunchCrossing());
691 unsigned int planeNum = detId.
plane();
700 for (
auto &ds : *patterns)
707 unsigned int u = 0,
v = 0;
710 if (!
p.getFittable())
720 pp.patterns_u->Fill(u);
721 pp.patterns_v->Fill(
v);
728 auto &
pp = it.second;
731 unsigned int pl_u = planes_u[rpId].size();
732 unsigned int pl_v = planes_v[rpId].size();
735 const auto &rp_pat_it = patterns->find(rpId);
737 unsigned int pat_u = 0, pat_v = 0;
738 if (rp_pat_it != patterns->end())
740 for (
auto &
p : *rp_pat_it)
742 if (!
p.getFittable())
756 if (pl_u == 0 && pl_v == 0) category = 0;
758 if (category == -1 && pat_u + pat_v <= 1)
766 if (pat_u == 1 && pat_v == 1) category = 2;
768 if (category == -1) category = 3;
770 pp.event_category->Fill(category);
774 for (
auto &ds : *tracks)
786 unsigned int n_pl_in_fit_u = 0, n_pl_in_fit_v = 0;
787 for (
auto &hds : ft.getHits())
802 pp.h_planes_fit_u->Fill(n_pl_in_fit_u);
803 pp.h_planes_fit_v->Fill(n_pl_in_fit_v);
809 double rp_x = ( geometry->GetDetector(plId_V)->translation().x() +
810 geometry->GetDetector(plId_U)->translation().x() ) / 2.;
811 double rp_y = ( geometry->GetDetector(plId_V)->translation().y() +
812 geometry->GetDetector(plId_U)->translation().y() ) / 2.;
815 CLHEP::Hep3Vector rod_U = geometry->LocalToGlobalDirection(plId_U, CLHEP::Hep3Vector(0., 1., 0.));
816 CLHEP::Hep3Vector rod_V = geometry->LocalToGlobalDirection(plId_V, CLHEP::Hep3Vector(0., 1., 0.));
818 double x = ft.getX0() - rp_x;
819 double y = ft.getY0() - rp_y;
821 pp.trackHitsCumulativeHist->Fill(x, y);
823 double U = x * rod_U.x() + y * rod_U.y();
824 double V = x * rod_V.x() + y * rod_V.y();
826 pp.track_u_profile->Fill(U);
827 pp.track_v_profile->Fill(V);
838 map<unsigned int, unsigned int> mTop, mHor, mBot;
847 for (
auto &ds : *tracks)
850 unsigned int rpNum = rpId.
rp();
858 if (rpNum == 0 || rpNum == 4)
860 if (rpNum == 2 || rpNum == 3)
862 if (rpNum == 1 || rpNum == 5)
867 for (
auto &
p : armPlots)
869 p.second.h_numRPWithTrack_top->Fill(mTop[
p.first]);
870 p.second.h_numRPWithTrack_hor->Fill(mHor[
p.first]);
871 p.second.h_numRPWithTrack_bot->Fill(mBot[
p.first]);
875 for (
auto &ds1 : *tracks)
877 for (
auto &tr1 : ds1)
883 unsigned int arm1 = rpId1.
arm();
884 unsigned int stNum1 = rpId1.station();
885 unsigned int rpNum1 = rpId1.rp();
886 unsigned int idx1 = stNum1/2 * 7 + rpNum1;
887 bool hor1 = (rpNum1 == 2 || rpNum1 == 3);
892 for (
auto &ds2 : *tracks)
894 for (
auto &tr2 : ds2)
900 unsigned int arm2 = rpId2.
arm();
901 unsigned int stNum2 = rpId2.station();
902 unsigned int rpNum2 = rpId2.rp();
903 unsigned int idx2 = stNum2/2 * 7 + rpNum2;
904 bool hor2 = (rpNum2 == 2 || rpNum2 == 3);
Detector ID class for TOTEM Si strip detectors.
MonitorElement * event_category
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
MonitorElement * cluster_profile_cumulative
PhiMemoryImage patterns[9]
MonitorElement * activity
void Init(DQMStore::IBooker &ibooker)
MonitorElement * h_trackCorr_overlap
MonitorElement * vfat_corruption
MonitorElement * cluster_size
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
void beginLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &eSetup)
MonitorElement * h_planes_fit_u
#define DEFINE_FWK_MODULE(type)
MonitorElement * activity_per_bx
std::map< unsigned int, ArmPlots > armPlots
void analyze(edm::Event const &e, edm::EventSetup const &eSetup)
int bunchCrossing() const
MonitorElement * events_per_bx
MonitorElement * h_lrc_x_f
MonitorElement * track_u_profile
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 * activity_v
MonitorElement * efficiency_den
MonitorElement * h_lrc_y_f
MonitorElement * patterns_v
plots related to one (anti)diagonal
virtual ~TotemRPDQMSource()
edm::EDGetTokenT< edm::DetSetVector< TotemRPUVPattern > > tokenUVPattern
MonitorElement * h_numRPWithTrack_bot
MonitorElement * efficiency_num
MonitorElement * book1D(Args &&...args)
MonitorElement * h_trackCorr_hor
void rpName(std::string &name, NameFlag flag=nFull) const
CTPPSDetId getRPId() const
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
MonitorElement * events_per_bx_short
void armName(std::string &name, NameFlag flag=nFull) const
MonitorElement * vfat_missing
MonitorElement * track_v_profile
void endLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &eSetup)
plots related to one station
edm::EDGetTokenT< edm::DetSetVector< TotemRPCluster > > tokenCluster
MonitorElement * hit_multiplicity
MonitorElement * hit_plane_hist
std::map< unsigned int, StationPlots > stationPlots
void setCurrentFolder(const std::string &fullpath)
CTPPSDetId getArmId() const
void endRun(edm::Run const &run, edm::EventSetup const &eSetup)
MonitorElement * book2D(Args &&...args)
void setPlane(uint32_t det)
TH1F * getTH1F(void) const
MonitorElement * patterns_u
MonitorElement * h_lrc_x_d
MonitorElement * activity_u
Base class for CTPPS detector IDs.
TotemRPDQMSource(const edm::ParameterSet &ps)
MonitorElement * vfat_ec_bc_error
ESHandle< TrackerGeometry > geometry
MonitorElement * vfat_problem
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
std::map< unsigned int, DiagonalPlots > diagonalPlots
TH2F * getTH2F(void) const
MonitorElement * h_planes_fit_v
MonitorElement * digi_profile_cumulative
MonitorElement * h_lrc_y_n
edm::EDGetTokenT< edm::DetSetVector< TotemRPLocalTrack > > tokenLocalTrack
MonitorElement * activity_per_bx_short
edm::EDGetTokenT< edm::DetSetVector< TotemVFATStatus > > tokenStatus
MonitorElement * trackHitsCumulativeHist