CMS 3D CMS Logo

SiStripDaqInfo.cc
Go to the documentation of this file.
4 
7 
11 
13 
14 //Run Info
18 // FED cabling and numbering
22 
23 #include <iostream>
24 #include <iomanip>
25 #include <cstdio>
26 #include <string>
27 #include <sstream>
28 #include <cmath>
29 #include <vector>
30 
31 //
32 // -- Contructor
33 //
35  m_cacheID_(0) {
36 
37  // Create MessageSender
38  edm::LogInfo( "SiStripDaqInfo") << "SiStripDaqInfo::Deleting SiStripDaqInfo ";
39 
40  // get back-end interface
42  nFedTotal = 0;
43  bookedStatus_ = false;
44 }
46  edm::LogInfo("SiStripDaqInfo") << "SiStripDaqInfo::Deleting SiStripDaqInfo ";
47 
48 }
49 //
50 // -- Begin Job
51 //
53 
54 }
55 //
56 // -- Book MEs for SiStrip Daq Fraction
57 //
59  edm::LogInfo( "SiStripDcsInfo") << " SiStripDaqInfo::bookStatus " << bookedStatus_;
60  if (!bookedStatus_) {
61  dqmStore_->cd();
62  std::string strip_dir = "";
63  SiStripUtility::getTopFolderPath(dqmStore_, "SiStrip", strip_dir);
64  if (!strip_dir.empty()) dqmStore_->setCurrentFolder(strip_dir+"/EventInfo");
65  else dqmStore_->setCurrentFolder("SiStrip/EventInfo");
66 
67 
68  DaqFraction_= dqmStore_->bookFloat("DAQSummary");
69 
70  dqmStore_->cd();
71  if (!strip_dir.empty()) dqmStore_->setCurrentFolder(strip_dir+"/EventInfo/DAQContents");
72  else dqmStore_->setCurrentFolder("SiStrip/EventInfo/DAQContents");
73 
74  std::vector<std::string> det_type;
75  det_type.push_back("TIB");
76  det_type.push_back("TOB");
77  det_type.push_back("TIDF");
78  det_type.push_back("TIDB");
79  det_type.push_back("TECF");
80  det_type.push_back("TECB");
81 
82  for ( std::vector<std::string>::iterator it = det_type.begin(); it != det_type.end(); it++) {
83  std::string det = (*it);
84 
85  SubDetMEs local_mes;
86  std::string me_name;
87  me_name = "SiStrip_" + det;
88  local_mes.DaqFractionME = dqmStore_->bookFloat(me_name);
89  local_mes.ConnectedFeds = 0;
90  SubDetMEsMap.insert(make_pair(det, local_mes));
91  }
92  bookedStatus_ = true;
93  dqmStore_->cd();
94  }
95 }
96 //
97 // -- Fill with Dummy values
98 //
100  if (!bookedStatus_) bookStatus();
101  if (bookedStatus_) {
102  for (std::map<std::string, SubDetMEs>::iterator it = SubDetMEsMap.begin(); it != SubDetMEsMap.end(); it++) {
103  it->second.DaqFractionME->Reset();
104  it->second.DaqFractionME->Fill(-1.0);
105  }
106  DaqFraction_->Reset();
107  DaqFraction_->Fill(-1.0);
108  }
109 }
110 //
111 // -- Begin Run
112 //
114  edm::LogInfo ("SiStripDaqInfo") <<"SiStripDaqInfo:: Begining of Run";
115 
116  // Check latest Fed cabling and create TrackerMapCreator
117  unsigned long long cacheID = eSetup.get<SiStripFedCablingRcd>().cacheIdentifier();
118  if (m_cacheID_ != cacheID) {
119  m_cacheID_ = cacheID;
120 
121  eSetup.get<SiStripFedCablingRcd>().get(fedCabling_);
122 
123  readFedIds(fedCabling_, eSetup);
124  }
125  if (!bookedStatus_) bookStatus();
126  if (nFedTotal == 0) {
127  fillDummyStatus();
128  edm::LogInfo ("SiStripDaqInfo") <<" SiStripDaqInfo::No FEDs Connected!!!";
129  return;
130  }
131 
132  float nFEDConnected = 0.0;
133  const int siStripFedIdMin = FEDNumbering::MINSiStripFEDID;
134  const int siStripFedIdMax = FEDNumbering::MAXSiStripFEDID;
135 
137  if( eSetup.find( recordKey ) != nullptr) {
138 
139  edm::ESHandle<RunInfo> sumFED;
140  eSetup.get<RunInfoRcd>().get(sumFED);
141 
142  if ( sumFED.isValid() ) {
143  std::vector<int> FedsInIds= sumFED->m_fed_in;
144  for(unsigned int it = 0; it < FedsInIds.size(); ++it) {
145  int fedID = FedsInIds[it];
146 
147  if(fedID>=siStripFedIdMin && fedID<=siStripFedIdMax) ++nFEDConnected;
148  }
149  edm::LogInfo ("SiStripDaqInfo") <<" SiStripDaqInfo::Total # of FEDs " << nFedTotal
150  << " Connected FEDs " << nFEDConnected;
151  if (nFEDConnected > 0) {
152  DaqFraction_->Reset();
153  DaqFraction_->Fill(nFEDConnected/nFedTotal);
154  readSubdetFedFractions(FedsInIds,eSetup);
155  }
156  }
157  }
158 }
159 //
160 // -- Analyze
161 //
163 }
164 
165 //
166 // -- End Luminosity Block
167 //
169  edm::LogInfo( "SiStripDaqInfo") << "SiStripDaqInfo::endLuminosityBlock";
170 }
171 //
172 // -- End Run
173 //
175  edm::LogInfo ("SiStripDaqInfo") <<"SiStripDaqInfo::EndRun";
176 }
177 //
178 // -- Read Sub Detector FEDs
179 //
181 
182  //Retrieve tracker topology from geometry
183  edm::ESHandle<TrackerTopology> tTopoHandle;
184  iSetup.get<TrackerTopologyRcd>().get(tTopoHandle);
185  const TrackerTopology* const tTopo = tTopoHandle.product();
186 
187  auto feds = fedCabling_->fedIds();
188 
189  nFedTotal = feds.size();
190  for(std::vector<unsigned short>::const_iterator ifed = feds.begin(); ifed != feds.end(); ifed++){
191  auto fedChannels = fedCabling_->fedConnections( *ifed );
192  for (auto iconn = fedChannels.begin(); iconn < fedChannels.end(); iconn++){
193  if (!iconn->isConnected()) continue;
194  uint32_t detId = iconn->detId();
195  if (detId == 0 || detId == 0xFFFFFFFF) continue;
197  SiStripUtility::getSubDetectorTag(detId,subdet_tag,tTopo);
198  subDetFedMap[subdet_tag].push_back(*ifed);
199  break;
200  }
201  }
202 }
203 //
204 // -- Fill Subdet FEDIds
205 //
206 void SiStripDaqInfo::readSubdetFedFractions(std::vector<int>& fed_ids, edm::EventSetup const& iSetup) {
207 
208  //Retrieve tracker topology from geometry
209  edm::ESHandle<TrackerTopology> tTopoHandle;
210  iSetup.get<TrackerTopologyRcd>().get(tTopoHandle);
211  const TrackerTopology* const tTopo = tTopoHandle.product();
212 
213  const int siStripFedIdMin = FEDNumbering::MINSiStripFEDID;
214  const int siStripFedIdMax = FEDNumbering::MAXSiStripFEDID;
215 
216  // initialiase
217  for (std::map<std::string, std::vector<unsigned short> >::const_iterator it = subDetFedMap.begin();
218  it != subDetFedMap.end(); it++) {
219  std::string name = it->first;
220  std::map<std::string, SubDetMEs>::iterator iPos = SubDetMEsMap.find(name);
221  if (iPos == SubDetMEsMap.end()) continue;
222  iPos->second.ConnectedFeds = 0;
223  }
224  // count sub detector feds
225 
226 
227  for (std::map<std::string, std::vector<unsigned short> >::const_iterator it = subDetFedMap.begin();
228  it != subDetFedMap.end(); it++) {
229  std::string name = it->first;
230  std::vector<unsigned short> subdetIds = it->second;
231  std::map<std::string, SubDetMEs>::iterator iPos = SubDetMEsMap.find(name);
232  if (iPos == SubDetMEsMap.end()) continue;
233  iPos->second.ConnectedFeds = 0;
234  for (std::vector<unsigned short>::iterator iv = subdetIds.begin();
235  iv != subdetIds.end(); iv++) {
236  bool fedid_found = false;
237  for(unsigned int it = 0; it < fed_ids.size(); ++it) {
238  unsigned short fedID = fed_ids[it];
239  if(fedID < siStripFedIdMin || fedID > siStripFedIdMax) continue;
240  if ((*iv) == fedID) {
241  fedid_found = true;
242  iPos->second.ConnectedFeds++;
243  break;
244  }
245  }
246  if (!fedid_found) findExcludedModule((*iv),tTopo);
247  }
248  int nFedsConnected = iPos->second.ConnectedFeds;
249  int nFedSubDet = subdetIds.size();
250  if (nFedSubDet > 0) {
251  iPos->second.DaqFractionME->Reset();
252  iPos->second.DaqFractionME->Fill(nFedsConnected*1.0/nFedSubDet);
253  }
254  }
255 }
256 //
257 // -- find Excluded Modules
258 //
259 void SiStripDaqInfo::findExcludedModule(unsigned short fed_id, const TrackerTopology* tTopo) {
260  dqmStore_->cd();
261  std::string mdir = "MechanicalView";
262  if (!SiStripUtility::goToDir(dqmStore_, mdir)) {
263  dqmStore_->setCurrentFolder("SiStrip/"+mdir);
264  }
265  std::string mechanical_dir = dqmStore_->pwd();
266  auto fedChannels = fedCabling_->fedConnections(fed_id);
267  int ichannel = 0;
268  std::string tag = "ExcludedFedChannel";
269  std::string bad_module_folder;
270  for (std::vector<FedChannelConnection>::const_iterator iconn = fedChannels.begin();
271  iconn < fedChannels.end(); iconn++){
272  if (!iconn->isConnected()) continue;
273  uint32_t detId = iconn->detId();
274  if (detId == 0 || detId == 0xFFFFFFFF) continue;
275 
276  ichannel++;
277  if (ichannel == 1) {
278  std::string subdet_folder ;
279  SiStripFolderOrganizer folder_organizer;
280  folder_organizer.getSubDetFolder(detId,tTopo,subdet_folder);
281  if (!dqmStore_->dirExists(subdet_folder)) {
282  subdet_folder = mechanical_dir + subdet_folder.substr(subdet_folder.find(mdir)+mdir.size());
283  }
284  bad_module_folder = subdet_folder + "/" + "BadModuleList";
285  dqmStore_->setCurrentFolder(bad_module_folder);
286  }
287  std::ostringstream detid_str;
288  detid_str << detId;
289  std::string full_path = bad_module_folder + "/" + detid_str.str();
290  MonitorElement* me = dqmStore_->get(full_path);
291  uint16_t flag = 0;
292  if (me) {
293  flag = me->getIntValue();
294  me->Reset();
295  } else me = dqmStore_->bookInt(detid_str.str());
297  me->Fill(flag);
298  }
299  dqmStore_->cd();
300 }
static void setBadModuleFlag(std::string &hname, uint16_t &flg)
void getSubDetFolder(const uint32_t &detid, const TrackerTopology *tTopo, std::string &folder_name)
void readFedIds(const edm::ESHandle< SiStripFedCabling > &fedcabling, edm::EventSetup const &iSetup)
void beginRun(edm::Run const &run, edm::EventSetup const &eSetup) override
Begin Run.
void cd(void)
go to top directory (ie. root)
Definition: DQMStore.cc:718
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
static HCTypeTag findType(char const *iTypeName)
find a type based on the types name, if not found will return default HCTypeTag
void findExcludedModule(unsigned short fed_id, const TrackerTopology *tTopo)
MonitorElement * bookFloat(const char *name)
Book float.
Definition: DQMStore.cc:972
const eventsetup::EventSetupRecord * find(const eventsetup::EventSetupRecordKey &) const
Definition: EventSetup.cc:91
void Fill(long long x)
void endLuminosityBlock(edm::LuminosityBlock const &lumiSeg, edm::EventSetup const &iSetup) override
End Of Luminosity.
edm::ESHandle< SiStripFedCabling > fedCabling_
void beginJob() override
BeginJob.
std::vector< int > m_fed_in
Definition: RunInfo.h:26
FedsConstIterRange fedIds() const
const std::string subdet_tag("SubDet")
void analyze(edm::Event const &, edm::EventSetup const &) override
Analyze.
SiStripDaqInfo(const edm::ParameterSet &ps)
Constructor.
void endRun(edm::Run const &run, edm::EventSetup const &eSetup) override
EndRun.
MonitorElement * get(const std::string &path) const
get ME from full pathname (e.g. "my/long/dir/my_histo")
Definition: DQMStore.cc:1807
DQMStore * dqmStore_
std::map< std::string, SubDetMEs > SubDetMEsMap
~SiStripDaqInfo() override
Destructor.
bool dirExists(const std::string &path) const
true if directory exists
Definition: DQMStore.cc:806
std::map< std::string, std::vector< unsigned short > > subDetFedMap
int64_t getIntValue(void) const
const T & get() const
Definition: EventSetup.h:55
MonitorElement * DaqFractionME
void readSubdetFedFractions(std::vector< int > &fed_ids, edm::EventSetup const &iSetup)
ConnsConstIterRange fedConnections(uint16_t fed_id) const
static void getSubDetectorTag(uint32_t det_id, std::string &subdet_tag, const TrackerTopology *tTopo)
void fillDummyStatus()
MonitorElement * DaqFraction_
bool isValid() const
Definition: ESHandle.h:47
MonitorElement * bookInt(const char *name)
Book int.
Definition: DQMStore.cc:942
unsigned long long m_cacheID_
void Reset(void)
reset ME (ie. contents, errors, etc)
static bool goToDir(DQMStore *dqm_store, std::string name)
T const * product() const
Definition: ESHandle.h:86
static void getTopFolderPath(DQMStore *dqm_store, std::string top_dir, std::string &path)
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:741
Definition: event.py:1
Definition: Run.h:43
const std::string & pwd(void) const
Definition: DQMStore.cc:713