33 #include <xercesc/parsers/XercesDOMParser.hpp> 34 #include <xercesc/dom/DOM.hpp> 35 #include <xercesc/sax/HandlerBase.hpp> 36 #include <xercesc/util/XMLString.hpp> 37 #include <xercesc/util/PlatformUtils.hpp> 116 enum NodeType {
nUnknown, nSkip, nTop, nArm, nRPStation, nRPPot, nRPPlane, nDiamondPlane, nChip, nDiamondCh, nChannel, nSampicBoard, nSampicChannel, nTotemTimingPlane, nTotemTimingCh };
122 void ParseXML(
ParseType,
const string &
file,
const std::unique_ptr<TotemDAQMapping>&,
const std::unique_ptr<TotemAnalysisMask>&);
126 const std::unique_ptr<TotemDAQMapping>&,
const std::unique_ptr<TotemAnalysisMask>&);
129 void ParseTreeDiamond(
ParseType, xercesc::DOMNode *,
NodeType,
unsigned int parentID,
130 const std::unique_ptr<TotemDAQMapping>&,
const std::unique_ptr<TotemAnalysisMask>&);
133 void ParseTreeTotemTiming(
ParseType, xercesc::DOMNode *,
NodeType,
unsigned int parentID,
134 const std::unique_ptr<TotemDAQMapping>&,
const std::unique_ptr<TotemAnalysisMask>&);
138 string CompleteFileName(
const string &fn);
147 NodeType GetNodeType(xercesc::DOMNode *);
164 void GetChannels(xercesc::DOMNode *
n, std::set<unsigned char> &channels);
168 return ((type == nArm)||(type == nRPStation)||(type == nRPPot)||(type == nRPPlane)||(type == nChip));
173 return ((type == nArm)||(type == nRPStation)||(type == nRPPot)||(type == nDiamondPlane)||(type == nDiamondCh));
178 return ((type == nArm)||(type == nRPStation)||(type == nRPPot)||(type == nSampicBoard)||(type == nSampicChannel)||(type == nTotemTimingPlane)||(type == nTotemTimingCh));
183 return ((type==nChip)||(type==nArm));
226 verbosity(conf.getUntrackedParameter<unsigned
int>(
"verbosity", 0)),
227 subSystemName(conf.getUntrackedParameter<
string>(
"subSystem")),
229 currentBlockValid(
false)
231 for (
const auto it : conf.
getParameter<vector<ParameterSet>>(
"configuration"))
236 b.
maskFileNames = it.getParameter< vector<string> >(
"maskFileNames");
241 findingRecord<TotemReadoutRcd>();
250 <<
">> TotemDAQMappingESSourceXML::setIntervalFor(" << key.
name() <<
")";
287 throw cms::Exception(
"TotemDAQMappingESSourceXML::setIntervalFor") <<
288 "No configuration for event " << iosv.
eventID();
313 auto mapping = std::make_unique<TotemDAQMapping>();
314 auto mask = std::make_unique<TotemAnalysisMask>();
319 XMLPlatformUtils::Initialize();
321 catch (
const XMLException& toCatch)
335 XMLPlatformUtils::Terminate();
344 const std::unique_ptr<TotemDAQMapping> &
mapping,
const std::unique_ptr<TotemAnalysisMask> &
mask)
346 unique_ptr<XercesDOMParser>
parser(
new XercesDOMParser());
347 parser->parse(file.c_str());
349 DOMDocument* domDoc = parser->getDocument();
352 throw cms::Exception(
"TotemDAQMappingESSourceXML::ParseXML") <<
"Cannot parse file `" << file
353 <<
"' (domDoc = NULL).";
355 DOMElement* elementRoot = domDoc->getDocumentElement();
358 throw cms::Exception(
"TotemDAQMappingESSourceXML::ParseXML") <<
"File `" <<
359 file <<
"' is empty.";
371 unsigned int parentID,
const std::unique_ptr<TotemDAQMapping>&
mapping,
372 const std::unique_ptr<TotemAnalysisMask>&
mask)
375 printf(
">> TotemDAQMappingESSourceXML::ParseTreeRP(%s, %u, %u)\n",
cms::xerces::toString(parent->getNodeName()),
376 parentType, parentID);
379 DOMNodeList *
children = parent->getChildNodes();
381 for (
unsigned int i = 0;
i < children->getLength();
i++)
383 DOMNode *
n = children->item(
i);
384 if (n->getNodeType() != DOMNode::ELEMENT_NODE)
400 case nArm: expectedParentType =
nTop;
break;
406 default: expectedParentType =
nUnknown;
break;
409 if (expectedParentType != parentType)
416 unsigned int id = 0, hw_id = 0;
417 bool id_set =
false, hw_id_set =
false;
418 bool fullMask =
false;
419 DOMNamedNodeMap* attr = n->getAttributes();
421 for (
unsigned int j = 0; j < attr->getLength(); j++)
423 DOMNode *
a = attr->item(j);
443 throw cms::Exception(
"TotemDAQMappingESSourceXML::ParseTreeRP") <<
"id not given for element `" 447 throw cms::Exception(
"TotemDAQMappingESSourceXML::ParseTreeRP") <<
"hw_id not given for element `" 451 throw cms::Exception(
"TotemDAQMappingESSourceXML::ParseTreeRP") <<
452 "Plane IDs range from 0 to 9. id = " <<
id <<
" is invalid.";
455 printf(
"\tID found: 0x%x\n",
id);
463 vfatInfo.
hwID = hw_id;
465 const unsigned int armIdx = (parentID / 1000) % 10;
466 const unsigned int stIdx = (parentID / 100) % 10;
467 const unsigned int rpIdx = (parentID / 10) % 10;
468 const unsigned int plIdx = parentID % 10;
472 mapping->insert(framepos, vfatInfo);
480 const unsigned int armIdx = (parentID / 1000) % 10;
481 const unsigned int stIdx = (parentID / 100) % 10;
482 const unsigned int rpIdx = (parentID / 10) % 10;
483 const unsigned int plIdx = parentID % 10;
492 mask->insert(symbId, am);
498 ParseTreeRP(pType, n, type, parentID * 10 +
id, mapping, mask);
505 unsigned int parentID,
const std::unique_ptr<TotemDAQMapping>&
mapping,
506 const std::unique_ptr<TotemAnalysisMask>&
mask)
510 printf(
">> TotemDAQMappingESSourceXML::ParseTreeDiamond(%s, %u, %u)\n",
cms::xerces::toString(parent->getNodeName()),
511 parentType, parentID);
514 DOMNodeList *
children = parent->getChildNodes();
516 for (
unsigned int i = 0;
i < children->getLength();
i++)
518 DOMNode *
n = children->item(
i);
519 if (n->getNodeType() != DOMNode::ELEMENT_NODE)
534 case nArm: expectedParentType =
nTop;
break;
539 default: expectedParentType =
nUnknown;
break;
542 if (expectedParentType != parentType)
549 unsigned int id =0,hw_id = 0;
550 bool id_set =
false,hw_id_set =
false;
551 DOMNamedNodeMap* attr = n->getAttributes();
553 for (
unsigned int j = 0; j < attr->getLength(); j++)
555 DOMNode *
a = attr->item(j);
573 throw cms::Exception(
"TotemDAQMappingESSourceXML::ParseTreeDiamond") <<
"id not given for element `" 577 throw cms::Exception(
"TotemDAQMappingESSourceXML::ParseTreeDiamond") <<
"hw_id not given for element `" 581 throw cms::Exception(
"TotemDAQMappingESSourceXML::ParseTreeDiamond") <<
582 "Plane IDs range from 0 to 3. id = " <<
id <<
" is invalid.";
585 printf(
"\tID found: 0x%x\n",
id);
595 vfatInfo.
hwID = hw_id;
599 unsigned int ArmNum = (parentID/ 10000) % 10;
600 unsigned int StationNum = (parentID / 1000) % 10;
601 unsigned int RpNum = (parentID/ 100) % 10;
602 unsigned int PlaneNum = (parentID % 100) ;
610 mapping->insert(framepos, vfatInfo);
615 unsigned int childId;
617 childId = parentID * 100 +
id;
619 childId = parentID * 10 +
id;
631 unsigned int parentID,
const std::unique_ptr<TotemDAQMapping>&
mapping,
632 const std::unique_ptr<TotemAnalysisMask>&
mask)
634 DOMNodeList *
children = parent->getChildNodes();
637 for (
unsigned int i = 0;
i < children->getLength();
i++)
639 DOMNode *
child = children->item(
i);
644 DOMNamedNodeMap* attr = parent->getAttributes();
645 for (
unsigned int j = 0; j < attr->getLength(); j++)
647 DOMNode *
a = attr->item(j);
655 unsigned int hwId = 0;
656 attr = child->getAttributes();
657 for (
unsigned int j = 0; j < attr->getLength(); j++)
659 DOMNode *
a = attr->item(j);
670 for (
unsigned int i = 0;
i < children->getLength();
i++)
672 DOMNode *
n = children->item(
i);
673 if (n->getNodeType() != DOMNode::ELEMENT_NODE)
685 case nArm: expectedParentType =
nTop;
break;
692 default: expectedParentType =
nUnknown;
break;
695 if (expectedParentType != parentType)
704 DOMNamedNodeMap* attr = n->getAttributes();
707 for (
unsigned int j = 0; j < attr->getLength(); j++)
709 DOMNode *
a = attr->item(j);
721 throw cms::Exception(
"TotemDAQMappingESSourceXML::ParseTreeTotemTiming") <<
"id not given for element `" 724 throw cms::Exception(
"TotemDAQMappingESSourceXML::ParseTreeTotemTiming") <<
725 "SampicBoard IDs range from 0 to 5. id = " <<
id <<
" is invalid.";
734 unsigned int ArmNum = (parentID/ 10000) % 10;
735 unsigned int StationNum = (parentID / 1000) % 10;
736 unsigned int RpNum = (parentID/ 100) % 10;
740 mapping->insert(framepos, vfatInfo);
745 unsigned int childId;
747 childId = parentID * 100 +
id;
749 childId = parentID * 10 +
id;
761 unsigned char attributeFlag = 0;
763 DOMNamedNodeMap* attr = chipnode->getAttributes();
764 for (
unsigned int j = 0; j < attr->getLength(); j++)
766 DOMNode *
a = attr->item(j);
779 "Wrong/incomplete DAQ channel specification (attributeFlag = " << attributeFlag <<
").";
810 if (
Test(n,
"trigger_vfat"))
return nSkip;
812 throw cms::Exception(
"TotemDAQMappingESSourceXML::GetNodeType") <<
"Unknown tag `" 820 DOMNodeList *
children = n->getChildNodes();
821 for (
unsigned int i = 0;
i < children->getLength();
i++)
823 DOMNode *n = children->item(
i);
824 if (n->getNodeType() != DOMNode::ELEMENT_NODE || !
Test(n,
"channel"))
827 DOMNamedNodeMap* attr = n->getAttributes();
829 for (
unsigned int j = 0; j < attr->getLength(); j++)
831 DOMNode *
a = attr->item(j);
845 throw cms::Exception(
"TotemDAQMappingESSourceXML::GetChannels") <<
846 "Channel tags must have an `id' attribute.";
Detector ID class for TOTEM Si strip detectors.
T getParameter(std::string const &) const
auto setWhatProduced(T *iThis, const es::Label &iLabel={})
EventNumber_t event() const
Contains data on masked channels of a VFAT.
static const std::string tagChannel
bool CommonNode(NodeType type)
string GetNodeContent(xercesc::DOMNode *parent)
returns the content of the node
bool contains(EventRange const &lh, EventID const &rh)
Loads TotemDAQMapping and TotemAnalysisMask from two XML files.
static const std::string tagDiamondPlane
diamond specific tags
edm::ESProducts< std::unique_ptr< TotemDAQMapping >, std::unique_ptr< TotemAnalysisMask > > produce(const TotemReadoutRcd &)
const EventID & eventID() const
bool TotemTimingNode(NodeType type)
edm::EventRange validityRange
validity interval
bool RPNode(NodeType type)
EventSetup record for TOTEM readout-related information.
bool currentBlockValid
flag whether the 'currentBlock' index is valid
NodeType
enumeration of XML node types
std::pair< Time_t, Time_t > ValidityInterval
TotemSymbID symbolicID
the symbolic id
static const std::string tagSampicCh
NodeType GetNodeType(xercesc::DOMNode *)
determines node type
std::vector< std::string > mappingFileNames
the mapping files
LuminosityBlockNumber_t luminosityBlock() const
static const std::string tagVFAT
static const std::string tagChip1
COMMON Chip XML tags.
string subSystemName
label of the CTPPS sub-system
ESProducts< std::remove_reference_t< TArgs >... > products(TArgs &&...args)
void setIntervalFor(const edm::eventsetup::EventSetupRecordKey &, const edm::IOVSyncValue &, edm::ValidityInterval &) override
sets infinite validity of this data
std::string toString(XMLCh const *toTranscode)
void ParseTreeTotemTiming(ParseType, xercesc::DOMNode *, NodeType, unsigned int parentID, const std::unique_ptr< TotemDAQMapping > &, const std::unique_ptr< TotemAnalysisMask > &)
recursive method to extract RP-related information from the DOM tree
vector< ConfigBlock > configuration
Symbolic ID describing an entity of a TOTEM subdetector.
static const std::string tagTotemTimingPlane
static const std::string tagDiamondCh
EventID startEventID() const
static const std::string tagRPStation
RP XML tags.
TotemFramePosition ChipFramePosition(xercesc::DOMNode *chipnode)
extracts VFAT's DAQ channel from XML attributes
void ParseTreeDiamond(ParseType, xercesc::DOMNode *, NodeType, unsigned int parentID, const std::unique_ptr< TotemDAQMapping > &, const std::unique_ptr< TotemAnalysisMask > &)
recursive method to extract RP-related information from the DOM tree
const char * name() const
EventID endEventID() const
std::vector< std::string > maskFileNames
the mask files
bool DiamondNode(NodeType type)
bool fullMask
whether all channels of the VFAT shall be masked
unsigned int symbolicID
chip ID, raw integer representation of DetId class
Hw Id mapping for Totem Timing (dynamical mapping in Sampic)
#define DEFINE_FWK_EVENTSETUP_SOURCE(type)
static const std::string tagArm
Common position tags.
unsigned int hwID
the hardware ID (16 bit)
void ParseXML(ParseType, const string &file, const std::unique_ptr< TotemDAQMapping > &, const std::unique_ptr< TotemAnalysisMask > &)
parses XML file
TotemDAQMappingESSourceXML(const edm::ParameterSet &)
string GetNodeValue(xercesc::DOMNode *node)
returns the value of the node
ParseType
whether to parse a mapping of a mask XML
bool Test(xercesc::DOMNode *node, const std::string &name)
returns true iff the node is of the given name
static const std::string tagAnalysisMask
static const std::string tagChip2
std::set< unsigned char > maskedChannels
list of channels to be masked
unsigned int currentBlock
index of the current block in 'configuration' array
static const std::string tagSampicBoard
totem timing specific tags
Detector ID class for CTPPS Timing Diamond detectors. Bits [19:31] : Assigend in CTPPSDetId Calss Bit...
std::string fullPath() const
void ParseTreeRP(ParseType, xercesc::DOMNode *, NodeType, unsigned int parentID, const std::unique_ptr< TotemDAQMapping > &, const std::unique_ptr< TotemAnalysisMask > &)
recursive method to extract RP-related information from the DOM tree
static const std::string tagRPPot
static const std::string tagRPPlane
std::vector< std::string > mappingFileNames
the mapping files
static const std::string tagTotemTimingCh
~TotemDAQMappingESSourceXML() override
void GetChannels(xercesc::DOMNode *n, std::set< unsigned char > &channels)
static bool checkXMLAttributeFlag(unsigned char flag)
returns true if all attributes have been set
Contains mappind data related to a VFAT.
unsigned char setXMLAttribute(const std::string &attribute, const std::string &value, unsigned char &flag)
string CompleteFileName(const string &fn)
adds the path prefix, if needed
Detector ID class for CTPPS Totem Timing detectors. Bits [19:31] : Assigend in CTPPSDetId Calss Bits ...