#include <InitMsgCollection.h>
Public Member Functions | |
bool | addIfUnique (InitMsgView const &initMsgView) |
bool | addIfUnique (I2OChain const &, InitMsgSharedPtr &) |
void | clear () |
InitMsgSharedPtr | getElementAt (const unsigned int index) const |
InitMsgSharedPtr | getElementForOutputModuleId (const uint32_t &) const |
InitMsgSharedPtr | getElementForOutputModuleLabel (const std::string &) const |
std::string | getOutputModuleName (const uint32_t outputModuleId) const |
std::string | getSelectionHelpString () const |
InitMsgCollection () | |
size_t | size () const |
~InitMsgCollection () | |
Static Public Member Functions | |
static std::string | stringsToText (Strings const &list, unsigned int maxCount=0) |
Private Types | |
typedef std::map< uint32_t, InitMsgSharedPtr > | InitMsgMap |
Private Member Functions | |
void | checkOutputModuleLabel (InitMsgView const &) const |
Private Attributes | |
InitMsgMap | initMsgMap_ |
boost::mutex | listLock_ |
Definition at line 35 of file InitMsgCollection.h.
typedef std::map<uint32_t,InitMsgSharedPtr> stor::InitMsgCollection::InitMsgMap [private] |
Definition at line 174 of file InitMsgCollection.h.
InitMsgCollection::InitMsgCollection | ( | ) |
InitMsgCollection constructor.
Definition at line 21 of file InitMsgCollection.cc.
References hitfit::clear().
{ clear(); }
InitMsgCollection::~InitMsgCollection | ( | ) |
bool InitMsgCollection::addIfUnique | ( | InitMsgView const & | initMsgView | ) |
Adds the specified INIT message to the collection if it has a unique HLT output module label.
If we already have an INIT message with the same output module label as the input INIT message, the duplicate message is *not* added to the collection, and this method returns false.
If the output module label inside the INIT message is empty, an exception is thrown.
initMsgView | The INIT message to be added to the collection. |
cms::Exception | if one of the consistency checks fails. |
Definition at line 32 of file InitMsgCollection.cc.
References filterCSVwithJSON::copy, InitMsgView::outputModuleId(), pos, InitMsgView::size(), and InitMsgView::startAddress().
{ boost::mutex::scoped_lock sl(listLock_); // check if the outputModuleId was already seen const uint32_t outputModuleId = initMsgView.outputModuleId(); InitMsgMap::iterator pos = initMsgMap_.lower_bound(outputModuleId); if ( pos != initMsgMap_.end() && !(initMsgMap_.key_comp()(outputModuleId, pos->first))) return false; // init message already exists checkOutputModuleLabel(initMsgView); // add the message to the internal list InitMsgSharedPtr serializedProds(new InitMsgBuffer(initMsgView.size())); std::copy( initMsgView.startAddress(), initMsgView.startAddress()+initMsgView.size(), &(*serializedProds)[0] ); initMsgMap_.insert(pos, InitMsgMap::value_type(outputModuleId,serializedProds)); return true; // new init message }
bool InitMsgCollection::addIfUnique | ( | I2OChain const & | i2oChain, |
InitMsgSharedPtr & | serializedProds | ||
) |
Adds the INIT message contained in the specified I2OChain to the collection if it has a unique HLT output module label.
If we already have an INIT message with the same output module label as the input INIT message, the duplicate message is *not* added to the collection, and this method returns false.
If the INIT message is new, the InitMsgView will contain the view of INIT message and the method returns true.
If the output module label inside the INIT message is empty, an exception is thrown.
i2oChain | the I2OChain containing an INIT message |
initMsgView | the INIT view which was added to the collection. |
cms::Exception | if one of the consistency checks fails. |
Definition at line 57 of file InitMsgCollection.cc.
References stor::I2OChain::copyFragmentsIntoBuffer(), stor::I2OChain::outputModuleId(), pos, and stor::I2OChain::totalDataSize().
{ boost::mutex::scoped_lock sl(listLock_); // check if the outputModuleId was already seen const uint32_t outputModuleId = i2oChain.outputModuleId(); InitMsgMap::iterator pos = initMsgMap_.lower_bound(outputModuleId); if ( pos != initMsgMap_.end() && !(initMsgMap_.key_comp()(outputModuleId, pos->first))) return false; // init message already exists // build the init message view serializedProds.reset( new InitMsgBuffer(i2oChain.totalDataSize()) ); i2oChain.copyFragmentsIntoBuffer( *serializedProds ); InitMsgView initMsgView(&(*serializedProds)[0]); checkOutputModuleLabel(initMsgView); // add the message to the internal list initMsgMap_.insert(pos, InitMsgMap::value_type(outputModuleId,serializedProds)); return true; // new init message }
void InitMsgCollection::checkOutputModuleLabel | ( | InitMsgView const & | initMsgView | ) | const [private] |
Definition at line 81 of file InitMsgCollection.cc.
References Exception, and InitMsgView::outputModuleLabel().
{ const std::string inputOMLabel = initMsgView.outputModuleLabel(); const std::string trimmedOMLabel = boost::algorithm::trim_copy(inputOMLabel); if (trimmedOMLabel.empty()) { throw cms::Exception("InitMsgCollection", "addIfUnique:") << "Invalid INIT message: the HLT output module label is empty!" << std::endl; } }
void InitMsgCollection::clear | ( | void | ) |
Removes all entries from the collection.
Definition at line 169 of file InitMsgCollection.cc.
{ boost::mutex::scoped_lock sl(listLock_); initMsgMap_.clear(); }
InitMsgSharedPtr InitMsgCollection::getElementAt | ( | const unsigned int | index | ) | const |
Returns a shared pointer to the requested element in the collection or an empty pointer if the requested index if out of bounds.
index | The index of the requested element. |
Definition at line 153 of file InitMsgCollection.cc.
References alignCSCRings::e.
{ boost::mutex::scoped_lock sl(listLock_); InitMsgSharedPtr ptrToElement; try { ptrToElement = initMsgMap_.at(index); } catch (std::out_of_range& e) { } return ptrToElement; }
InitMsgSharedPtr InitMsgCollection::getElementForOutputModuleId | ( | const uint32_t & | requestedOutputModuleId | ) | const |
Fetches the single INIT message that matches the requested HLT output module id. If no messages match the request, an empty pointer is returned.
requestedOutputModuleId | The HLT output module id of the INIT message to be returned. |
Definition at line 94 of file InitMsgCollection.cc.
{ boost::mutex::scoped_lock sl(listLock_); InitMsgSharedPtr serializedProds; InitMsgMap::const_iterator it = initMsgMap_.find(requestedOutputModuleId); if (it != initMsgMap_.end()) serializedProds = it->second; return serializedProds; }
InitMsgSharedPtr InitMsgCollection::getElementForOutputModuleLabel | ( | const std::string & | requestedOutputModuleLabel | ) | const |
Fetches the single INIT message that matches the requested HLT output module label. If no messages match the request, an empty pointer is returned.
If the requested HLT output module label is empty, and there is only one INIT message in the collection, that INIT message is returned. However, if there is more than one INIT message in the collection, and an empty request is passed into this method, an exception will be thrown. (How can we decide which is the best match when we have nothing to work with?)
requestedOutputModuleLabel | The HLT output module label of the INIT message to be returned. |
cms::Exception | if the input HLT output module label string is empty and there is more than one INIT message in the collection. |
Definition at line 108 of file InitMsgCollection.cc.
References Exception, lumiQueryAPI::msg, and InitMsgView::outputModuleLabel().
{ boost::mutex::scoped_lock sl(listLock_); InitMsgSharedPtr serializedProds; // handle the special case of an empty request // (If we want to use class methods to check the collection size and // fetch the last element in the collection, then we would need to // switch to recursive mutexes...) if (requestedOutputModuleLabel.empty()) { if (initMsgMap_.size() == 1) { serializedProds = initMsgMap_.begin()->second; } else if (initMsgMap_.size() > 1) { std::string msg = "Invalid INIT message lookup: the requested "; msg.append("HLT output module label is empty but there are multiple "); msg.append("HLT output modules to choose from."); throw cms::Exception("InitMsgCollection", "getElementForOutputModule:") << msg << std::endl; } } else { // loop over the existing messages for (InitMsgMap::const_iterator msgIter = initMsgMap_.begin(), msgIterEnd = initMsgMap_.end(); msgIter != msgIterEnd; msgIter++) { InitMsgSharedPtr workingMessage = msgIter->second; InitMsgView existingInitMsg(&(*workingMessage)[0]); std::string existingOMLabel = existingInitMsg.outputModuleLabel(); // check if the output module labels match if (requestedOutputModuleLabel == existingOMLabel) { serializedProds = workingMessage; break; } } } return serializedProds; }
std::string InitMsgCollection::getOutputModuleName | ( | const uint32_t | outputModuleId | ) | const |
Returns the name of the output module with the specified module ID, or an empty string of the specified module ID is not known.
Definition at line 233 of file InitMsgCollection.cc.
References InitMsgView::outputModuleLabel().
{ boost::mutex::scoped_lock sl(listLock_); InitMsgMap::const_iterator it = initMsgMap_.find(outputModuleId); if (it == initMsgMap_.end()) { return ""; } else { InitMsgSharedPtr serializedProds = it->second; const InitMsgView initMsgView(&(*serializedProds)[0]); return initMsgView.outputModuleLabel(); } }
std::string InitMsgCollection::getSelectionHelpString | ( | ) | const |
Returns a string with information on which selections are available.
Definition at line 183 of file InitMsgCollection.cc.
References InitMsgView::hltTriggerNames(), InitMsgView::hltTriggerSelections(), and InitMsgView::outputModuleLabel().
{ boost::mutex::scoped_lock sl(listLock_); // nothing much we can say if the collection is empty if (initMsgMap_.empty()) { return "No information is available about the available triggers."; } // list the full set of available triggers std::string helpString; helpString.append("The full list of trigger paths is the following:"); // we can just use the list from the first entry since all // subsequent entries are forced to be the same InitMsgSharedPtr serializedProds = initMsgMap_.begin()->second; InitMsgView existingInitMsg(&(*serializedProds)[0]); Strings existingTriggerList; existingInitMsg.hltTriggerNames(existingTriggerList); for (unsigned int idx = 0; idx < existingTriggerList.size(); idx++) { helpString.append("\n " + existingTriggerList[idx]); } // list the output modules (INIT messages) helpString.append("\nThe registered HLT output modules and their "); helpString.append("trigger selections are the following:"); // loop over the existing messages for (InitMsgMap::const_iterator msgIter = initMsgMap_.begin(), msgIterEnd = initMsgMap_.end(); msgIter != msgIterEnd; msgIter++) { serializedProds = msgIter->second; InitMsgView workingInitMsg(&(*serializedProds)[0]); helpString.append("\n *** Output module \""); helpString.append(workingInitMsg.outputModuleLabel()); helpString.append("\" ***"); Strings workingSelectionList; workingInitMsg.hltTriggerSelections(workingSelectionList); for (unsigned int idx = 0; idx < workingSelectionList.size(); idx++) { helpString.append("\n " + workingSelectionList[idx]); } } // return the result return helpString; }
size_t InitMsgCollection::size | ( | void | ) | const |
Returns the number of unique INIT messages in the collection.
Definition at line 176 of file InitMsgCollection.cc.
{ boost::mutex::scoped_lock sl(listLock_); return initMsgMap_.size(); }
std::string InitMsgCollection::stringsToText | ( | Strings const & | list, |
unsigned int | maxCount = 0 |
||
) | [static] |
Creates a single text string from the elements in the specified list of strings. The specified maximum number of elements are included, however a zero value for the maximum number will include all elements.
list | the list of strings to include (std::vector of strings); |
maxCount | the maximum number of list elements to include. |
Definition at line 251 of file InitMsgCollection.cc.
{ std::string resultString = ""; unsigned int elementCount = list.size(); if (maxCount > 0 && maxCount < elementCount) {elementCount = maxCount;} for (unsigned int idx = 0; idx < elementCount; idx++) { resultString.append(list[idx]); if (idx < (elementCount-1)) { resultString.append(", "); } } if (elementCount < list.size()) { resultString.append(", ..."); } return resultString; }
Definition at line 175 of file InitMsgCollection.h.
boost::mutex stor::InitMsgCollection::listLock_ [mutable, private] |
Definition at line 176 of file InitMsgCollection.h.