160 events_per_bx = ibooker.
book1D(
"events per BX",
"rp;Event.BX", 4002, -1.5, 4000. + 0.5);
161 events_per_bx_short = ibooker.
book1D(
"events per BX (short)",
"rp;Event.BX", 102, -1.5, 100. + 0.5);
163 h_trackCorr_hor = ibooker.
book2D(
"track correlation RP-210-hor",
"rp, 210, hor", 4, -0.5, 3.5, 4, -0.5, 3.5);
164 TH2F *
hist = h_trackCorr_hor->getTH2F();
165 TAxis *xa = hist->GetXaxis(), *ya = hist->GetYaxis();
166 xa->SetBinLabel(1,
"45, 210, near"); ya->SetBinLabel(1,
"45, 210, near");
167 xa->SetBinLabel(2,
"45, 210, far"); ya->SetBinLabel(2,
"45, 210, far");
168 xa->SetBinLabel(3,
"56, 210, near"); ya->SetBinLabel(3,
"56, 210, near");
169 xa->SetBinLabel(4,
"56, 210, far"); ya->SetBinLabel(4,
"56, 210, far");
178 bool diag = (top45 != top56);
181 sprintf(name,
"%s 45%s - 56%s",
182 (diag) ?
"diagonal" :
"antidiagonal",
183 (top45) ?
"top" :
"bot",
184 (top56) ?
"top" :
"bot"
190 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.);
191 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.);
192 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.);
194 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.);
195 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.);
196 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.);
204 path.replace(0, 2,
"TrackingStrip");
213 h_trackCorr = ibooker.
book2D(
"track RP correlation", title, 13, -0.5, 12.5, 13, -0.5, 12.5);
215 TAxis *xa = h_trackCorr_h->GetXaxis(), *ya = h_trackCorr_h->GetYaxis();
216 xa->SetBinLabel(1,
"210, near, top"); ya->SetBinLabel(1,
"210, near, top");
217 xa->SetBinLabel(2,
"bot"); ya->SetBinLabel(2,
"bot");
218 xa->SetBinLabel(3,
"hor"); ya->SetBinLabel(3,
"hor");
219 xa->SetBinLabel(4,
"far, hor"); ya->SetBinLabel(4,
"far, hor");
220 xa->SetBinLabel(5,
"top"); ya->SetBinLabel(5,
"top");
221 xa->SetBinLabel(6,
"bot"); ya->SetBinLabel(6,
"bot");
222 xa->SetBinLabel(8,
"220, near, top"); ya->SetBinLabel(8,
"220, near, top");
223 xa->SetBinLabel(9,
"bot"); ya->SetBinLabel(9,
"bot");
224 xa->SetBinLabel(10,
"hor"); ya->SetBinLabel(10,
"hor");
225 xa->SetBinLabel(11,
"far, hor"); ya->SetBinLabel(11,
"far, hor");
226 xa->SetBinLabel(12,
"top"); ya->SetBinLabel(12,
"top");
227 xa->SetBinLabel(13,
"bot"); ya->SetBinLabel(13,
"bot");
231 xa = h_trackCorr_h->GetXaxis(); ya = h_trackCorr_h->GetYaxis();
232 xa->SetBinLabel(1,
"210, near, top"); ya->SetBinLabel(1,
"210, near, top");
233 xa->SetBinLabel(2,
"bot"); ya->SetBinLabel(2,
"bot");
234 xa->SetBinLabel(3,
"hor"); ya->SetBinLabel(3,
"hor");
235 xa->SetBinLabel(4,
"far, hor"); ya->SetBinLabel(4,
"far, hor");
236 xa->SetBinLabel(5,
"top"); ya->SetBinLabel(5,
"top");
237 xa->SetBinLabel(6,
"bot"); ya->SetBinLabel(6,
"bot");
238 xa->SetBinLabel(8,
"220, near, top"); ya->SetBinLabel(8,
"220, near, top");
239 xa->SetBinLabel(9,
"bot"); ya->SetBinLabel(9,
"bot");
240 xa->SetBinLabel(10,
"hor"); ya->SetBinLabel(10,
"hor");
241 xa->SetBinLabel(11,
"far, hor"); ya->SetBinLabel(11,
"far, hor");
242 xa->SetBinLabel(12,
"top"); ya->SetBinLabel(12,
"top");
243 xa->SetBinLabel(13,
"bot"); ya->SetBinLabel(13,
"bot");
251 path.replace(0, 2,
"TrackingStrip");
261 path.replace(0, 2,
"TrackingStrip");
266 vfat_problem = ibooker.
book2D(
"vfats with any problem", title+
";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
267 vfat_missing = ibooker.
book2D(
"vfats missing", title+
";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
268 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);
269 vfat_corruption = ibooker.
book2D(
"vfats with data corruption", title+
";plane;vfat index", 10, -0.5, 9.5, 4, -0.5, 3.5);
271 activity = ibooker.
book1D(
"active planes", title+
";number of active planes", 11, -0.5, 10.5);
272 activity_u = ibooker.
book1D(
"active planes U", title+
";number of active U planes", 11, -0.5, 10.5);
273 activity_v = ibooker.
book1D(
"active planes V", title+
";number of active V planes", 11, -0.5, 10.5);
275 activity_per_bx = ibooker.
book1D(
"activity per BX", title+
";Event.BX", 4002, -1.5, 4000. + 0.5);
276 activity_per_bx_short = ibooker.
book1D(
"activity per BX (short)", title+
";Event.BX", 102, -1.5, 100. + 0.5);
278 hit_plane_hist = ibooker.
book2D(
"activity in planes (2D)", title+
";plane number;strip number", 10, -0.5, 9.5, 32, -0.5, 511.5);
280 patterns_u = ibooker.
book1D(
"recognized patterns U", title+
";number of recognized U patterns", 11, -0.5, 10.5);
281 patterns_v = ibooker.
book1D(
"recognized patterns V", title+
";number of recognized V patterns", 11, -0.5, 10.5);
283 h_planes_fit_u = ibooker.
book1D(
"planes contributing to fit U", title+
";number of planes contributing to U fit", 6, -0.5, 5.5);
284 h_planes_fit_v = ibooker.
book1D(
"planes contributing to fit V", title+
";number of planes contributing to V fit", 6, -0.5, 5.5);
286 event_category = ibooker.
book1D(
"event category", title+
";event category", 5, -0.5, 4.5);
287 TH1F *event_category_h = event_category->
getTH1F();
288 event_category_h->GetXaxis()->SetBinLabel(1,
"empty");
289 event_category_h->GetXaxis()->SetBinLabel(2,
"insufficient");
290 event_category_h->GetXaxis()->SetBinLabel(3,
"single-track");
291 event_category_h->GetXaxis()->SetBinLabel(4,
"multi-track");
292 event_category_h->GetXaxis()->SetBinLabel(5,
"shower");
294 trackHitsCumulativeHist = ibooker.
book2D(
"track XY profile", title+
";x (mm);y (mm)", 100, -18., +18., 100, -18., +18.);
296 track_u_profile = ibooker.
book1D(
"track profile U", title+
"; U (mm)", 512, -256*66E-3, +256*66E-3);
297 track_v_profile = ibooker.
book1D(
"track profile V", title+
"; V (mm)", 512, -256*66E-3, +256*66E-3);
306 path.replace(0, 2,
"TrackingStrip");
311 digi_profile_cumulative = ibooker.
book1D(
"digi profile", title+
";strip number", 512, -0.5, 511.5);
312 cluster_profile_cumulative = ibooker.
book1D(
"cluster profile", title+
";cluster center", 1024, -0.25, 511.75);
313 hit_multiplicity = ibooker.
book1D(
"hit multiplicity", title+
";hits/detector/event", 6, -0.5, 5.5);
314 cluster_size = ibooker.
book1D(
"cluster size", title+
";hits per cluster", 5, 0.5, 5.5);
316 efficiency_num = ibooker.
book1D(
"efficiency num", title+
";track position (mm)", 30, -15., 0.);
317 efficiency_den = ibooker.
book1D(
"efficiency den", title+
";track position (mm)", 30, -15., 0.);
324 verbosity(ps.getUntrackedParameter<unsigned int>(
"verbosity", 0))
370 for (
unsigned int arm = 0; arm < 2; arm++)
375 for (
unsigned int st = 0; st < 3; st += 2)
377 unsigned int stId = 10*arm + st;
382 for (
unsigned int rp = 0; rp < 6; ++rp)
384 unsigned int rpId = 10*stId + rp;
389 for (
unsigned int pl = 0; pl < 10; ++pl)
391 unsigned int plId = 10*rpId + pl;
451 "ERROR in TotemDQMModuleRP::analyze > some of the required inputs are not valid. Skipping this event.\n"
452 <<
" status.isValid = " << status.
isValid() <<
"\n"
453 <<
" digi.isValid = " << digi.
isValid() <<
"\n"
454 <<
" digCluster.isValid = " << digCluster.
isValid() <<
"\n"
455 <<
" hits.isValid = " << hits.
isValid() <<
"\n"
456 <<
" patterns.isValid = " << patterns.
isValid() <<
"\n"
457 <<
" tracks.isValid = " << tracks.
isValid();
470 for (
auto &ds1 : *tracks)
472 for (
auto &tr1 : ds1)
477 unsigned int rpId1 = ds1.detId();
478 unsigned int arm1 = rpId1 / 100;
479 unsigned int stNum1 = (rpId1 / 10) % 10;
480 unsigned int rpNum1 = rpId1 % 10;
481 if (stNum1 != 0 || (rpNum1 != 2 && rpNum1 != 3))
483 unsigned int idx1 = arm1*2 + rpNum1-2;
485 for (
auto &ds2 : *tracks)
487 for (
auto &tr2 : ds2)
492 unsigned int rpId2 = ds2.detId();
493 unsigned int arm2 = rpId2 / 100;
494 unsigned int stNum2 = (rpId2 / 10) % 10;
495 unsigned int rpNum2 = rpId2 % 10;
496 if (stNum2 != 0 || (rpNum2 != 2 && rpNum2 != 3))
498 unsigned int idx2 = arm2*2 + rpNum2-2;
509 for (
auto &ds : *status)
512 unsigned int rpId = decId / 10;
513 unsigned int plNum = decId % 10;
521 plots.vfat_problem->Fill(plNum,
s.getChipPosition());
522 plots.vfat_missing->Fill(plNum,
s.getChipPosition());
525 if (
s.isECProgressError() ||
s.isBCProgressError())
527 plots.vfat_problem->Fill(plNum,
s.getChipPosition());
528 plots.vfat_ec_bc_error->Fill(plNum,
s.getChipPosition());
531 if (
s.isIDMismatch() ||
s.isFootprintError() ||
s.isCRCError())
533 plots.vfat_problem->Fill(plNum,
s.getChipPosition());
534 plots.vfat_corruption->Fill(plNum,
s.getChipPosition());
548 planePlots[DetId].digi_profile_cumulative->Fill(dit->getStripNumber());
558 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)
580 unsigned int rpId = ds.detId();
587 double rp_z = geometry->GetRPGlobalTranslation(rpId).z();
589 for (
unsigned int plNum = 0; plNum < 10; ++plNum)
591 unsigned int plDecId = rpId*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(plRawId, CLHEP::Hep3Vector(ft_x, ft_y, ft_z)).y();
600 bool hasMatchingHit =
false;
601 const auto &hit_ds_it = hits->find(plRawId);
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)
639 unsigned int planeNum = DetId % 10;
640 planes[RPId].insert(planeNum);
642 planes_u[RPId].insert(planeNum);
644 planes_v[RPId].insert(planeNum);
647 for (
const auto &ds : *status)
649 bool activity =
false;
650 for (
const auto &
s : ds)
652 if (
s.isNumberOfClustersSpecified() &&
s.getNumberOfClusters() > 0)
664 unsigned int planeNum = DetId % 10;
665 planes[RPId].insert(planeNum);
667 planes_u[RPId].insert(planeNum);
669 planes_v[RPId].insert(planeNum);
673 for (std::map<unsigned int, PotPlots>::iterator it =
potPlots.begin(); it !=
potPlots.end(); it++)
675 it->second.activity->Fill(planes[it->first].size());
676 it->second.activity_u->Fill(planes_u[it->first].size());
677 it->second.activity_v->Fill(planes_v[it->first].size());
679 if (planes[it->first].size() >= 6)
682 it->second.activity_per_bx_short->Fill(event.
bunchCrossing());
690 unsigned int planeNum = DetId % 10;
697 for (
auto &ds : *patterns)
699 unsigned int rpId = ds.detId();
703 unsigned int u = 0,
v = 0;
706 if (!
p.getFittable())
723 const unsigned int &
id = it.first;
724 auto &
pp = it.second;
727 unsigned int pl_u = planes_u[id].size();
728 unsigned int pl_v = planes_v[id].size();
731 const auto &rp_pat_it = patterns->find(
id);
733 unsigned int pat_u = 0, pat_v = 0;
734 if (rp_pat_it != patterns->end())
736 for (
auto &
p : *rp_pat_it)
738 if (!
p.getFittable())
752 if (pl_u == 0 && pl_v == 0) category = 0;
754 if (category == -1 && pat_u + pat_v <= 1)
762 if (pat_u == 1 && pat_v == 1) category = 2;
764 if (category == -1) category = 3;
766 pp.event_category->Fill(category);
770 for (
auto &ds : *tracks)
772 unsigned int RPId = ds.detId();
781 unsigned int n_pl_in_fit_u = 0, n_pl_in_fit_v = 0;
782 for (
auto &hds : ft.getHits())
784 unsigned int rawId = hds.detId();
808 CLHEP::Hep3Vector rod_U = geometry->LocalToGlobalDirection(
TotemRPDetId::decToRawId(RPId*10 + 1), CLHEP::Hep3Vector(0., 1., 0.));
809 CLHEP::Hep3Vector rod_V = geometry->LocalToGlobalDirection(
TotemRPDetId::decToRawId(RPId*10 + 0), CLHEP::Hep3Vector(0., 1., 0.));
811 double x = ft.getX0() - rp_x;
812 double y = ft.getY0() - rp_y;
816 double U = x * rod_U.x() + y * rod_U.y();
817 double V = x * rod_V.x() + y * rod_V.y();
831 map<unsigned int, unsigned int> mTop, mHor, mBot;
840 for (
auto &ds : *tracks)
842 unsigned int rpId = ds.detId();
843 unsigned int armNum = rpId / 100;
844 unsigned int rpNum = rpId % 10;
851 if (rpNum == 0 || rpNum == 4)
853 if (rpNum == 2 || rpNum == 3)
855 if (rpNum == 1 || rpNum == 5)
860 for (
auto &
p : armPlots)
862 p.second.h_numRPWithTrack_top->Fill(mTop[
p.first]);
863 p.second.h_numRPWithTrack_hor->Fill(mHor[
p.first]);
864 p.second.h_numRPWithTrack_bot->Fill(mBot[
p.first]);
868 for (
auto &ds1 : *tracks)
870 for (
auto &tr1 : ds1)
875 unsigned int rpId1 = ds1.detId();
876 unsigned int arm1 = rpId1 / 100;
877 unsigned int stNum1 = (rpId1 / 10) % 10;
878 unsigned int rpNum1 = rpId1 % 10;
879 unsigned int idx1 = stNum1/2 * 7 + rpNum1;
880 bool hor1 = (rpNum1 == 2 || rpNum1 == 3);
884 for (
auto &ds2 : *tracks)
886 for (
auto &tr2 : ds2)
891 unsigned int rpId2 = ds2.detId();
892 unsigned int arm2 = rpId2 / 100;
893 unsigned int stNum2 = (rpId2 / 10) % 10;
894 unsigned int rpNum2 = rpId2 % 10;
895 unsigned int idx2 = stNum2/2 * 7 + rpNum2;
896 bool hor2 = (rpNum2 == 2 || rpNum2 == 3);
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
static std::string rpName(unsigned int id, NameFlag flag=nFull)
returns official name of a RP characterized by ''id''; if ''full'' is true, name of station is prefix...
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.
static unsigned int rpOfDet(unsigned int i)
returns ID of RP for given detector ID ''i''
static std::string planeName(unsigned int id, NameFlag flag=nFull)
returns official name of a plane characterized by ''id''; if ''full'' is true, name of RP is prefixed...
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
static unsigned int rawToDecId(unsigned int raw)
fast conversion Raw to Decimal ID
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
static std::string stationName(unsigned int id, NameFlag flag=nFull)
returns official name of a station characterized by ''id''; if ''full'' is true, name of arm is prefi...
const PhiMemoryImage patterns[9]
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
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
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)
void endRun(edm::Run const &run, edm::EventSetup const &eSetup)
MonitorElement * book2D(Args &&...args)
TH1F * getTH1F(void) const
MonitorElement * patterns_u
MonitorElement * h_lrc_x_d
MonitorElement * activity_u
TotemRPDQMSource(const edm::ParameterSet &ps)
MonitorElement * vfat_ec_bc_error
ESHandle< TrackerGeometry > geometry
static std::string armName(unsigned int id, NameFlag flag=nFull)
returns official name of an arm characterized by ''id''; if ''full'' is true, prefix rp_ added ...
MonitorElement * vfat_problem
std::map< unsigned int, PotPlots > potPlots
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
static unsigned int decToRawId(unsigned int dec)
fast conversion Decimal to Raw ID
MonitorElement * activity_per_bx_short
edm::EDGetTokenT< edm::DetSetVector< TotemVFATStatus > > tokenStatus
MonitorElement * trackHitsCumulativeHist