CMS 3D CMS Logo

BeamSpotProblemMonitor.cc
Go to the documentation of this file.
1 /*
2  * \file BeamSpotProblemMonitor.cc
3  * \author Sushil S. Chauhan/UC Davis
4  *
5  */
6 
16 
20 
21 #include <numeric>
22 #include <cmath>
23 
24 using namespace std;
25 using namespace edm;
26 
27 //
28 // constructors and destructor
29 //
31  : dcsStatus_{consumes<DcsStatusCollection>(ps.getUntrackedParameter<InputTag>("DCSStatus"))},
32  scalertag_{consumes<BeamSpotOnlineCollection>(ps.getUntrackedParameter<InputTag>("scalarBSCollection"))},
33  trkSrc_{consumes<reco::TrackCollection>(ps.getUntrackedParameter<InputTag>("pixelTracks"))},
34  nTracks_{0},
35  nCosmicTrk_{ps.getUntrackedParameter<int>("nCosmicTrk")},
36  fitNLumi_{1},
37  debug_{ps.getUntrackedParameter<bool>("Debug")},
38  onlineMode_{ps.getUntrackedParameter<bool>("OnlineMode")},
39  doTest_{ps.getUntrackedParameter<bool>("doTest")},
40  alarmONThreshold_{ps.getUntrackedParameter<int>("AlarmONThreshold")},
41  alarmOFFThreshold_{ps.getUntrackedParameter<int>("AlarmOFFThreshold")},
42  lastlumi_{0},
43  nextlumi_{0},
44  processed_{false},
45  alarmOn_{false},
46  beamSpotStatus_{0},
47  beamSpotFromDB_{0} {
48  monitorName_ = ps.getUntrackedParameter<string>("monitorName");
49 
50  if (not monitorName_.empty())
51  monitorName_ += "/";
52 }
53 
56  desc.addUntracked<string>("monitorName", "BeamSpotProblemMonitor");
57  desc.addUntracked<InputTag>("DCSStatus", edm::InputTag("scalersRawToDigi"));
58  desc.addUntracked<InputTag>("scalarBSCollection", edm::InputTag("scalersRawToDigi"));
59  desc.addUntracked<InputTag>("pixelTracks", edm::InputTag("pixelTracks"));
60  desc.addUntracked<int>("nCosmicTrk", 10);
61  desc.addUntracked<bool>("Debug", false);
62  desc.addUntracked<bool>("OnlineMode", true);
63  desc.addUntracked<bool>("doTest", false);
64  desc.addUntracked<int>("AlarmONThreshold", 10);
65  desc.addUntracked<int>("AlarmOFFThreshold", 40);
66 
67  oDesc.add("dqmBeamSpotProblemMonitor", desc);
68 }
69 
70 //--------------------------------------------------------
71 void BeamSpotProblemMonitor::bookHistograms(DQMStore::IBooker& iB, const edm::Run&, const edm::EventSetup&) {
72  // create and cd into new folder
73  iB.setCurrentFolder(monitorName_ + "FitFromScalars");
74 
75  const string coord{"BeamSpotStatus"};
76 
77  string histName(coord + "_lumi");
78  string histTitle(coord);
79  const string ytitle("Problem (-1) / OK (1)");
80  const string xtitle("Lumisection");
81 
82  beamSpotStatusLumi_ = iB.book1D(histName, histTitle, 40, 0.5, 40.5);
85 
86  histName += "_all";
87  histTitle += " all";
88  beamSpotStatusLumiAll_ = iB.book1D(histName, histTitle, 40, 0.5, 40.5);
89  beamSpotStatusLumiAll_->getTH1()->SetCanExtend(TH1::kAllAxes);
92 
93  //NOTE: This in principal should be a Lumi only histogram since it gets reset at every
94  // dqmBeginLuminosityBlock call. However, it is also filled at that time and the DQMStore
95  // clears all lumi histograms at postGlobalBeginLuminosityBlock!
96  beamSpotError_ = iB.book1D("BeamSpotError", "ERROR: Beamspot missing from scalars", 20, 0.5, 20.5);
97  beamSpotError_->setAxisTitle("# of consecutive LSs with problem", 1);
98  beamSpotError_->setAxisTitle("Problem with scalar BeamSpot", 2);
99 }
100 
101 //--------------------------------------------------------
103  const int nthlumi = lumiSeg.luminosityBlock();
104 
105  if (onlineMode_) {
106  if (nthlumi > nextlumi_) {
107  fillPlots(lastlumi_, nextlumi_, nthlumi);
108  nextlumi_ = nthlumi;
109  edm::LogInfo("BeamSpotProblemMonitor") << "dqmBeginLuminosityBlock:: Next Lumi to Fit: " << nextlumi_ << endl;
110  }
111  } else {
112  if (processed_)
113  fillPlots(lastlumi_, nextlumi_, nthlumi);
114  nextlumi_ = nthlumi;
115  edm::LogInfo("BeamSpotProblemMonitor") << " dqmBeginLuminosityBlock:: Next Lumi to Fit: " << nextlumi_ << endl;
116  }
117 
118  if (processed_)
119  processed_ = false;
120  edm::LogInfo("BeamSpotProblemMonitor") << " dqmBeginLuminosityBlock:: Begin of Lumi: " << nthlumi << endl;
121 }
122 
123 // ----------------------------------------------------------
125  const int nthlumi = iEvent.luminosityBlock();
126 
127  if (onlineMode_ && (nthlumi < nextlumi_)) {
128  edm::LogInfo("BeamSpotProblemMonitor") << "analyze:: Spilt event from previous lumi section!" << std::endl;
129  return;
130  }
131  if (onlineMode_ && (nthlumi > nextlumi_)) {
132  edm::LogInfo("BeamSpotProblemMonitor") << "analyze:: Spilt event from next lumi section!!!" << std::endl;
133  return;
134  }
135 
136  beamSpotStatus_ = 0.;
137 
138  // Checking TK status
139  Handle<DcsStatusCollection> dcsStatus;
140  iEvent.getByToken(dcsStatus_, dcsStatus);
141  std::array<bool, 6> dcsTk;
142  for (auto& e : dcsTk) {
143  e = true;
144  }
145  for (auto const& status : *dcsStatus) {
146  if (!status.ready(DcsStatus::BPIX))
147  dcsTk[0] = false;
148  if (!status.ready(DcsStatus::FPIX))
149  dcsTk[1] = false;
150  if (!status.ready(DcsStatus::TIBTID))
151  dcsTk[2] = false;
152  if (!status.ready(DcsStatus::TOB))
153  dcsTk[3] = false;
154  if (!status.ready(DcsStatus::TECp))
155  dcsTk[4] = false;
156  if (!status.ready(DcsStatus::TECm))
157  dcsTk[5] = false;
158  }
159 
160  bool allTkOn = true;
161  for (auto status : dcsTk) {
162  if (!status) {
163  allTkOn = false;
164  break;
165  }
166  }
167 
168  //If tracker is ON and collision is going on then must be few track ther
170  iEvent.getByToken(trkSrc_, trackCollection);
171  for (auto const& track : *trackCollection) {
172  if (track.pt() > 1.0)
173  nTracks_++;
174  if (nTracks_ > 200)
175  break;
176  }
177 
178  // get scalar collection and BeamSpot
180  iEvent.getByToken(scalertag_, handleScaler);
181 
182  // beam spot scalar object
183  BeamSpotOnline spotOnline;
184 
185  bool fallBackToDB = false;
186  alarmOn_ = false;
187 
188  if (!handleScaler->empty()) {
189  spotOnline = *(handleScaler->begin());
190 
191  // check if we have a valid beam spot fit result from online DQM thrugh scalars
192  if (spotOnline.x() == 0. && spotOnline.y() == 0. && spotOnline.z() == 0. && spotOnline.width_x() == 0. &&
193  spotOnline.width_y() == 0.) {
194  fallBackToDB = true;
195  }
196  }
197 
198  //For testing set it false for every LSs
199  if (doTest_)
200  fallBackToDB = true;
201 
202  //based on last event of this lumi only as it overwrite it
203  if (allTkOn && fallBackToDB) {
204  beamSpotStatus_ = -1.;
205  } //i.e,from DB
206  if (allTkOn && (!fallBackToDB)) {
207  beamSpotStatus_ = 1.;
208  } //i.e,from online DQM
209 
210  //when collision at least few tracks should be there otherwise it give false ALARM
211  if (allTkOn && nTracks_ < nCosmicTrk_)
212  beamSpotStatus_ = 0.;
213 
214  processed_ = true;
215 }
216 
217 //--------------------------------------------------------
218 void BeamSpotProblemMonitor::fillPlots(int& lastlumi, int& nextlumi, int nthlumi) {
219  if (onlineMode_ && (nthlumi <= nextlumi))
220  return;
221 
222  int currentlumi = nextlumi;
223  lastlumi = currentlumi;
224 
225  //Chcek status and if lumi are in succession when fall to DB
226  if (beamSpotStatus_ == -1. && (lastlumi + 1) == nthlumi) {
227  beamSpotFromDB_++;
228  } else {
229  beamSpotFromDB_ = 0; //if not in succesion or status is ok then set zero
230  }
231 
233  alarmOn_ = true; //set the audio alarm true after N successive LSs
234  }
235 
237  alarmOn_ = false; //set the audio alarm true after 10 successive LSs
238  beamSpotFromDB_ = 0; //reset it for new incident
239  }
240 
241  if (onlineMode_) { // filling LS gap For status plot
242 
243  const int countLS_bs = beamSpotStatusLumi_->getTH1()->GetEntries();
244  int LSgap_bs = currentlumi / fitNLumi_ - countLS_bs;
245  if (currentlumi % fitNLumi_ == 0)
246  LSgap_bs--;
247 
248  // filling previous fits if LS gap ever exists
249  for (int ig = 0; ig < LSgap_bs; ig++) {
250  beamSpotStatusLumi_->ShiftFillLast(0., 0., fitNLumi_); //x0 , x0err, fitNLumi_; see DQMCore....
251  }
252 
255  0.,
256  fitNLumi_); //beamSpotStatus_ =>0. (no collision, no tracks); =>1 (OK from scaler), =>-1 (No scalar results)
258 
259  } else {
261  } //onlineMode_
262 
263  //Reset it here for next lumi
265  if (alarmOn_)
267 
268  //Get quality report
269  const QReport* beamSpotQReport = beamSpotError_->getQReport("BeamSpotOnlineTest");
270 
271  if (beamSpotQReport) {
272  /* S.Dutta : Commenting out these variables are not used and giving error with "-Werror=unused-variable" option
273  float qtresult = BeamSpotQReport->getQTresult();
274  int qtstatus = BeamSpotQReport->getStatus() ; // get QT status value (see table below) */
275  }
276 
277  nTracks_ = 0;
278 }
279 
280 //--------------------------------------------------------
282  const int nthlumi = lumiSeg.id().luminosityBlock();
283  edm::LogInfo("BeamSpotProblemMonitor")
284  << "dqmEndLuminosityBlock:: Lumi of the last event before dqmEndLuminosityBlock: " << nthlumi << endl;
285 }
286 //-------------------------------------------------------
287 
288 void BeamSpotProblemMonitor::dqmEndRun(const Run& r, const EventSetup& context) {
289  if (debug_)
290  edm::LogInfo("BeamSpotProblemMonitor") << "dqmEndRun:: Clearing all the Maps " << endl;
291  //Reset it end of job
293 }
294 
296 
297 // Local Variables:
298 // show-trailing-whitespace: t
299 // truncate-lines: t
300 // End:
BeamSpotOnlineProducer.h
ConfigurationDescriptions.h
BeamSpotOnline::x
float x() const
Definition: BeamSpotOnline.h:48
BeamSpotProblemMonitor::monitorName_
std::string monitorName_
Definition: BeamSpotProblemMonitor.h:44
BeamSpotProblemMonitor::BeamSpotProblemMonitor
BeamSpotProblemMonitor(const edm::ParameterSet &)
Definition: BeamSpotProblemMonitor.cc:30
MessageLogger.h
DcsStatus::TIBTID
Definition: DcsStatus.h:51
TrackCandidateCollection.h
BeamSpotProblemMonitor::doTest_
const bool doTest_
Definition: BeamSpotProblemMonitor.h:54
edm::LuminosityBlock
Definition: LuminosityBlock.h:50
BeamSpotProblemMonitor::beamSpotStatus_
double beamSpotStatus_
Definition: BeamSpotProblemMonitor.h:64
mps_update.status
status
Definition: mps_update.py:69
BeamSpotOnline::y
float y() const
Definition: BeamSpotOnline.h:49
edm::Run
Definition: Run.h:45
LuminosityBlock.h
edm
HLT enums.
Definition: AlignableModifier.h:19
BeamSpotProblemMonitor::fitNLumi_
const int fitNLumi_
Definition: BeamSpotProblemMonitor.h:51
edm::LogInfo
Definition: MessageLogger.h:254
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
edm::ParameterSet::getUntrackedParameter
T getUntrackedParameter(std::string const &, T const &) const
BeamSpotProblemMonitor::trkSrc_
const edm::EDGetTokenT< reco::TrackCollection > trkSrc_
Definition: BeamSpotProblemMonitor.h:47
BeamSpotOnline::width_x
float width_x() const
Definition: BeamSpotOnline.h:58
BeamSpotProblemMonitor::processed_
bool processed_
Definition: BeamSpotProblemMonitor.h:60
edm::Handle
Definition: AssociativeIterator.h:50
BeamSpotProblemMonitor::beamSpotFromDB_
int beamSpotFromDB_
Definition: BeamSpotProblemMonitor.h:65
BeamSpotProblemMonitor::dqmBeginLuminosityBlock
void dqmBeginLuminosityBlock(const edm::LuminosityBlock &lumiSeg, const edm::EventSetup &context) override
Definition: BeamSpotProblemMonitor.cc:102
BeamSpotProblemMonitor
Definition: BeamSpotProblemMonitor.h:26
BeamSpotProblemMonitor::nextlumi_
int nextlumi_
Definition: BeamSpotProblemMonitor.h:59
BeamSpotProblemMonitor::dcsStatus_
const edm::EDGetTokenT< DcsStatusCollection > dcsStatus_
Definition: BeamSpotProblemMonitor.h:45
MakerMacros.h
BeamSpotObjects.h
BeamSpotProblemMonitor::nCosmicTrk_
const int nCosmicTrk_
Definition: BeamSpotProblemMonitor.h:50
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
BeamSpot.h
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
edm::LuminosityBlockBase::luminosityBlock
LuminosityBlockNumber_t luminosityBlock() const
Definition: LuminosityBlockBase.h:40
dqm::impl::MonitorElement::Fill
void Fill(long long x)
Definition: MonitorElement.h:290
BeamSpotProblemMonitor::alarmOFFThreshold_
const int alarmOFFThreshold_
Definition: BeamSpotProblemMonitor.h:56
dqm::impl::MonitorElement::Reset
virtual void Reset()
Remove all data from the ME, keept the empty histogram with all its settings.
Definition: MonitorElement.cc:354
dqm::impl::MonitorElement::ShiftFillLast
DQM_DEPRECATED void ShiftFillLast(double y, double ye=0., int32_t xscale=1)
Definition: MonitorElement.cc:256
BeamSpotProblemMonitor::beamSpotError_
MonitorElement * beamSpotError_
Definition: BeamSpotProblemMonitor.h:70
DcsStatus::TECm
Definition: DcsStatus.h:54
BeamSpotProblemMonitor::lastlumi_
int lastlumi_
Definition: BeamSpotProblemMonitor.h:58
hgcalPlots.xtitle
xtitle
Definition: hgcalPlots.py:94
BeamSpotProblemMonitor::dqmEndLuminosityBlock
void dqmEndLuminosityBlock(const edm::LuminosityBlock &lumiSeg, const edm::EventSetup &c) override
Definition: BeamSpotProblemMonitor.cc:281
dqm::impl::MonitorElement::getTH1
virtual TH1 * getTH1()
Definition: MonitorElement.cc:969
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
dqm::impl::MonitorElement::getQReport
const MonitorElementData::QReport * getQReport(const std::string &qtname) const
get QReport corresponding to <qtname> (null pointer if QReport does not exist)
Definition: MonitorElement.cc:481
BeamSpotProblemMonitor::scalertag_
const edm::EDGetTokenT< BeamSpotOnlineCollection > scalertag_
Definition: BeamSpotProblemMonitor.h:46
edm::ParameterSetDescription::addUntracked
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:100
BeamSpotProblemMonitor::dqmEndRun
void dqmEndRun(const edm::Run &r, const edm::EventSetup &c) override
Definition: BeamSpotProblemMonitor.cc:288
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
edm::ParameterSet
Definition: ParameterSet.h:36
BeamSpotProblemMonitor::beamSpotStatusLumi_
MonitorElement * beamSpotStatusLumi_
Definition: BeamSpotProblemMonitor.h:68
duplicaterechits_cfi.trackCollection
trackCollection
Definition: duplicaterechits_cfi.py:4
Event.h
B2GTnPMonitor_cfi.histTitle
histTitle
Definition: B2GTnPMonitor_cfi.py:112
BeamSpotProblemMonitor.h
MonitorElementData::QReport
Definition: MonitorElementCollection.h:55
iEvent
int iEvent
Definition: GenABIO.cc:224
BeamSpotProblemMonitor::debug_
const bool debug_
Definition: BeamSpotProblemMonitor.h:52
BeamSpotProblemMonitor::nTracks_
int nTracks_
Definition: BeamSpotProblemMonitor.h:49
edm::LuminosityBlockID::luminosityBlock
LuminosityBlockNumber_t luminosityBlock() const
Definition: LuminosityBlockID.h:42
edm::LuminosityBlockBase::id
LuminosityBlockID id() const
Definition: LuminosityBlockBase.h:44
edm::EventSetup
Definition: EventSetup.h:57
DcsStatus::TECp
Definition: DcsStatus.h:53
BeamSpotOnline
Definition: BeamSpotOnline.h:28
alignCSCRings.r
r
Definition: alignCSCRings.py:93
BeamSpotProblemMonitor::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &)
Definition: BeamSpotProblemMonitor.cc:54
DcsStatus::FPIX
Definition: DcsStatus.h:56
dqm::impl::MonitorElement::setBinContent
virtual void setBinContent(int binx, double content)
set content of bin (1-D)
Definition: MonitorElement.cc:691
DcsStatus::TOB
Definition: DcsStatus.h:52
std
Definition: JetResolutionObject.h:76
BeamSpotOnline::width_y
float width_y() const
Definition: BeamSpotOnline.h:59
BeamSpotProblemMonitor::beamSpotStatusLumiAll_
MonitorElement * beamSpotStatusLumiAll_
Definition: BeamSpotProblemMonitor.h:69
BeamSpotProblemMonitor::fillPlots
void fillPlots(int &, int &, int)
Definition: BeamSpotProblemMonitor.cc:218
DcsStatus::BPIX
Definition: DcsStatus.h:55
HLT_2018_cff.track
track
Definition: HLT_2018_cff.py:10352
BeamSpotProblemMonitor::onlineMode_
const bool onlineMode_
Definition: BeamSpotProblemMonitor.h:53
TrackCandidate.h
BeamSpotOnline::z
float z() const
Definition: BeamSpotOnline.h:50
edm::Event
Definition: Event.h:73
dqm::impl::MonitorElement::setAxisTitle
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
Definition: MonitorElement.cc:800
edm::InputTag
Definition: InputTag.h:15
BeamSpotProblemMonitor::alarmONThreshold_
const int alarmONThreshold_
Definition: BeamSpotProblemMonitor.h:55
BeamSpotProblemMonitor::bookHistograms
void bookHistograms(DQMStore::IBooker &i, const edm::Run &r, const edm::EventSetup &c) override
Definition: BeamSpotProblemMonitor.cc:71
BeamSpotProblemMonitor::alarmOn_
bool alarmOn_
Definition: BeamSpotProblemMonitor.h:63
hgcalPlots.ytitle
ytitle
Definition: hgcalPlots.py:1410
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
BeamSpotProblemMonitor::analyze
void analyze(const edm::Event &e, const edm::EventSetup &c) override
Definition: BeamSpotProblemMonitor.cc:124