File indexing completed on 2025-05-27 01:56:24
0001 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/XMLConfigWriter.h"
0002 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/AlgoMuon.h"
0003 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/GoldenPattern.h"
0004 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/GoldenPatternResult.h"
0005 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/GoldenPatternWithStat.h"
0006 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/OMTFConfiguration.h"
0007 #include "L1Trigger/L1TMuonOverlapPhase1/interface/Omtf/OMTFinput.h"
0008
0009 #include "FWCore/Framework/interface/Event.h"
0010 #include "DataFormats/L1TMuon/interface/RegionalMuonCand.h"
0011
0012 #include "Utilities/Xerces/interface/Xerces.h"
0013
0014 #include <iostream>
0015 #include <sstream>
0016 #include <cmath>
0017 #include <ctime>
0018 #include <iomanip>
0019 #include <bitset>
0020
0021 #include "xercesc/framework/StdOutFormatTarget.hpp"
0022 #include "xercesc/framework/LocalFileFormatTarget.hpp"
0023 #include "xercesc/parsers/XercesDOMParser.hpp"
0024 #include "xercesc/dom/DOM.hpp"
0025 #include "xercesc/dom/DOMException.hpp"
0026 #include "xercesc/dom/DOMImplementation.hpp"
0027 #include "xercesc/sax/HandlerBase.hpp"
0028 #include "xercesc/util/XMLString.hpp"
0029 #include "xercesc/util/PlatformUtils.hpp"
0030 #include "xercesc/util/XercesDefs.hpp"
0031 #include "xercesc/util/XercesVersion.hpp"
0032 XERCES_CPP_NAMESPACE_USE
0033
0034 #if _XERCES_VERSION < 30100
0035 #include "xercesc/dom/DOMWriter.hpp"
0036 #else
0037 #include "xercesc/dom/DOMLSSerializer.hpp"
0038 #include "xercesc/dom/DOMLSOutput.hpp"
0039 #endif
0040
0041
0042 namespace {
0043 unsigned int eta2Bits(unsigned int eta) {
0044 if (eta == 73)
0045 return 0b100000000;
0046 else if (eta == 78)
0047 return 0b010000000;
0048 else if (eta == 85)
0049 return 0b001000000;
0050 else if (eta == 90)
0051 return 0b000100000;
0052 else if (eta == 94)
0053 return 0b000010000;
0054 else if (eta == 99)
0055 return 0b000001000;
0056 else if (eta == 103)
0057 return 0b000000100;
0058 else if (eta == 110)
0059 return 0b000000010;
0060 else if (eta == 75)
0061 return 0b110000000;
0062 else if (eta == 79)
0063 return 0b011000000;
0064 else if (eta == 92)
0065 return 0b000110000;
0066 else if (eta == 115)
0067 return 0b000000001;
0068 else if (eta == 121)
0069 return 0b000000000;
0070 else
0071 return 0b111111111;
0072 ;
0073 }
0074 }
0075
0076
0077
0078
0079 inline std::string _toString(XMLCh const* toTranscode) {
0080 std::string tmp(xercesc::XMLString::transcode(toTranscode));
0081 return tmp;
0082 }
0083
0084 inline XMLCh* _toDOMS(std::string temp) {
0085 XMLCh* buff = XMLString::transcode(temp.c_str());
0086 return buff;
0087 }
0088
0089
0090 XMLConfigWriter::XMLConfigWriter(const OMTFConfiguration* aOMTFConfig, bool writePdfThresholds, bool writeMeanDistPhi1)
0091 : writePdfThresholds(writePdfThresholds), writeMeanDistPhi1(writeMeanDistPhi1) {
0092 cms::concurrency::xercesInitialize();
0093
0094
0095 domImpl = DOMImplementationRegistry::getDOMImplementation(_toDOMS("Range"));
0096
0097 myOMTFConfig = aOMTFConfig;
0098 }
0099
0100
0101 XMLConfigWriter::~XMLConfigWriter() { cms::concurrency::xercesTerminate(); }
0102
0103
0104 void XMLConfigWriter::initialiseXMLDocument(const std::string& docName) {
0105 theDoc = domImpl->createDocument(nullptr, _toDOMS(docName), nullptr);
0106 theTopElement = theDoc->getDocumentElement();
0107
0108 const unsigned int mask16bits = 0xFFFF;
0109 const unsigned int version = (myOMTFConfig->patternsVersion() & mask16bits);
0110
0111 std::ostringstream stringStr;
0112 stringStr.str("");
0113 stringStr << "0x" << std::hex << std::setfill('0') << std::setw(4) << version;
0114 theTopElement->setAttribute(_toDOMS("version"), _toDOMS(stringStr.str()));
0115 }
0116
0117
0118 void XMLConfigWriter::finaliseXMLDocument(const std::string& fName) {
0119 XMLFormatTarget* formTarget = new LocalFileFormatTarget(fName.c_str());
0120
0121 #if _XERCES_VERSION < 30100
0122 xercesc::DOMWriter* domWriter = (dynamic_cast<DOMImplementation*>(domImpl))->createDOMWriter();
0123 if (domWriter->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true)) {
0124 domWriter->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);
0125 }
0126 domWriter->writeNode(formTarget, *theTopElement);
0127
0128 #else
0129 xercesc::DOMLSSerializer* theSerializer = (dynamic_cast<DOMImplementation*>(domImpl))->createLSSerializer();
0130 if (theSerializer->getDomConfig()->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true))
0131 theSerializer->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true);
0132 DOMLSOutput* theOutput = (dynamic_cast<DOMImplementation*>(domImpl))->createLSOutput();
0133 theOutput->setByteStream(formTarget);
0134 theSerializer->write(theTopElement, theOutput);
0135 theOutput->release();
0136 theSerializer->release();
0137 #endif
0138
0139 delete formTarget;
0140 }
0141
0142
0143 xercesc::DOMElement* XMLConfigWriter::writeEventHeader(unsigned int eventId, unsigned int mixedEventId) {
0144 unsigned int eventBx = eventId * 2;
0145
0146 xercesc::DOMElement* aEvent = nullptr;
0147 xercesc::DOMElement* aBx = nullptr;
0148 std::ostringstream stringStr;
0149
0150 aEvent = theDoc->createElement(_toDOMS("Event"));
0151
0152 stringStr.str("");
0153 stringStr << eventId;
0154 aEvent->setAttribute(_toDOMS("iEvent"), _toDOMS(stringStr.str()));
0155
0156 stringStr.str("");
0157 stringStr << mixedEventId;
0158 aEvent->setAttribute(_toDOMS("iMixedEvent"), _toDOMS(stringStr.str()));
0159
0160 aBx = theDoc->createElement(_toDOMS("bx"));
0161 stringStr.str("");
0162 stringStr << eventBx;
0163 aBx->setAttribute(_toDOMS("iBx"), _toDOMS(stringStr.str()));
0164 aEvent->appendChild(aBx);
0165
0166 theTopElement->appendChild(aEvent);
0167
0168 return aBx;
0169 }
0170
0171
0172 xercesc::DOMElement* XMLConfigWriter::writeEventData(xercesc::DOMElement* aTopElement,
0173 const OmtfName& board,
0174 const OMTFinput& aInput) {
0175 std::ostringstream stringStr;
0176
0177 xercesc::DOMElement* aProcessor = theDoc->createElement(_toDOMS("Processor"));
0178 aProcessor->setAttribute(_toDOMS("board"), _toDOMS(board.name()));
0179
0180 unsigned int iProcessor = board.processor();
0181 stringStr.str("");
0182 stringStr << iProcessor;
0183 aProcessor->setAttribute(_toDOMS("iProcessor"), _toDOMS(stringStr.str()));
0184 stringStr.str("");
0185 if (board.position() == 1)
0186 stringStr << "+";
0187 stringStr << board.position();
0188 aProcessor->setAttribute(_toDOMS("position"), _toDOMS(stringStr.str()));
0189
0190 xercesc::DOMElement *aLayer, *aHit;
0191 for (unsigned int iLayer = 0; iLayer < myOMTFConfig->nLayers(); ++iLayer) {
0192 aLayer = theDoc->createElement(_toDOMS("Layer"));
0193 stringStr.str("");
0194 stringStr << iLayer;
0195 aLayer->setAttribute(_toDOMS("iLayer"), _toDOMS(stringStr.str()));
0196 for (unsigned int iHit = 0; iHit < aInput.getMuonStubs()[iLayer].size(); ++iHit) {
0197 int hitPhi = aInput.getPhiHw(iLayer, iHit);
0198 if (hitPhi >= (int)myOMTFConfig->nPhiBins())
0199 continue;
0200
0201 aHit = theDoc->createElement(_toDOMS("Hit"));
0202 stringStr.str("");
0203 stringStr << iHit;
0204 aHit->setAttribute(_toDOMS("iInput"), _toDOMS(stringStr.str()));
0205 stringStr.str("");
0206 stringStr << hitPhi;
0207 aHit->setAttribute(_toDOMS("iPhi"), _toDOMS(stringStr.str()));
0208 stringStr.str("");
0209 stringStr << eta2Bits(abs(aInput.getHitEta(iLayer, iHit)));
0210 aHit->setAttribute(_toDOMS("iEta"), _toDOMS(stringStr.str()));
0211
0212 aLayer->appendChild(aHit);
0213 }
0214 if (aLayer->getChildNodes()->getLength())
0215 aProcessor->appendChild(aLayer);
0216 }
0217
0218 aTopElement->appendChild(aProcessor);
0219 return aProcessor;
0220 }
0221
0222
0223 void XMLConfigWriter::writeAlgoMuon(xercesc::DOMElement* aTopElement, const AlgoMuon& aCand) {
0224 xercesc::DOMElement* aResult = theDoc->createElement(_toDOMS("AlgoMuon"));
0225 std::ostringstream stringStr;
0226 stringStr.str("");
0227 stringStr << aCand.getRefHitNumber();
0228 aResult->setAttribute(_toDOMS("iRefHit"), _toDOMS(stringStr.str()));
0229 stringStr.str("");
0230 stringStr << aCand.getPtConstr();
0231 aResult->setAttribute(_toDOMS("ptCode"), _toDOMS(stringStr.str()));
0232 stringStr.str("");
0233 stringStr << aCand.getPhi();
0234 aResult->setAttribute(_toDOMS("phiCode"), _toDOMS(stringStr.str()));
0235 stringStr.str("");
0236 stringStr << eta2Bits(abs(aCand.getEtaHw()));
0237 aResult->setAttribute(_toDOMS("etaCode"), _toDOMS(stringStr.str()));
0238 stringStr.str("");
0239 stringStr << aCand.getChargeConstr();
0240 aResult->setAttribute(_toDOMS("charge"), _toDOMS(stringStr.str()));
0241 stringStr.str("");
0242 stringStr << aCand.getQ();
0243 aResult->setAttribute(_toDOMS("nHits"), _toDOMS(stringStr.str()));
0244 stringStr.str("");
0245 stringStr << aCand.getDisc();
0246 aResult->setAttribute(_toDOMS("disc"), _toDOMS(stringStr.str()));
0247 stringStr.str("");
0248 stringStr << aCand.getRefLayer();
0249 aResult->setAttribute(_toDOMS("iRefLayer"), _toDOMS(stringStr.str()));
0250 stringStr.str("");
0251 stringStr << std::bitset<18>(aCand.getFiredLayerBits());
0252 aResult->setAttribute(_toDOMS("layers"), _toDOMS(stringStr.str()));
0253 stringStr.str("");
0254 stringStr << aCand.getPhiRHit();
0255 aResult->setAttribute(_toDOMS("phiRHit"), _toDOMS(stringStr.str()));
0256 stringStr.str("");
0257 stringStr << aCand.getHwPatternNumConstr();
0258 aResult->setAttribute(_toDOMS("patNum"), _toDOMS(stringStr.str()));
0259
0260 aTopElement->appendChild(aResult);
0261 }
0262
0263
0264 void XMLConfigWriter::writeCandMuon(xercesc::DOMElement* aTopElement, const l1t::RegionalMuonCand& aCand) {
0265 xercesc::DOMElement* aResult = theDoc->createElement(_toDOMS("CandMuon"));
0266 std::ostringstream stringStr;
0267 stringStr.str("");
0268 stringStr << aCand.hwPt();
0269 aResult->setAttribute(_toDOMS("hwPt"), _toDOMS(stringStr.str()));
0270 stringStr.str("");
0271 stringStr << aCand.hwPhi();
0272 aResult->setAttribute(_toDOMS("hwPhi"), _toDOMS(stringStr.str()));
0273 stringStr.str("");
0274 stringStr << aCand.hwEta();
0275 aResult->setAttribute(_toDOMS("hwEta"), _toDOMS(stringStr.str()));
0276 stringStr.str("");
0277 stringStr << aCand.hwSign();
0278 aResult->setAttribute(_toDOMS("hwSign"), _toDOMS(stringStr.str()));
0279 stringStr.str("");
0280 stringStr << aCand.hwSignValid();
0281 aResult->setAttribute(_toDOMS("hwSignValid"), _toDOMS(stringStr.str()));
0282 stringStr.str("");
0283 stringStr << aCand.hwQual();
0284 aResult->setAttribute(_toDOMS("hwQual"), _toDOMS(stringStr.str()));
0285 stringStr.str("");
0286 std::map<int, int> hwAddrMap = aCand.trackAddress();
0287 stringStr << std::bitset<29>(hwAddrMap[0]);
0288 aResult->setAttribute(_toDOMS("hwTrackAddress"), _toDOMS(stringStr.str()));
0289 stringStr.str("");
0290 stringStr << aCand.link();
0291 aResult->setAttribute(_toDOMS("link"), _toDOMS(stringStr.str()));
0292 stringStr.str("");
0293 stringStr << aCand.processor();
0294 aResult->setAttribute(_toDOMS("processor"), _toDOMS(stringStr.str()));
0295 stringStr.str("");
0296 if (aCand.trackFinderType() == l1t::omtf_neg)
0297 stringStr << "OMTF_NEG";
0298 else if (aCand.trackFinderType() == l1t::omtf_pos)
0299 stringStr << "OMTF_POS";
0300 else
0301 stringStr << aCand.trackFinderType();
0302 aResult->setAttribute(_toDOMS("trackFinderType"), _toDOMS(stringStr.str()));
0303 aTopElement->appendChild(aResult);
0304 }
0305
0306
0307
0308
0309 void XMLConfigWriter::writeResultsData(xercesc::DOMElement* aTopElement,
0310 unsigned int iRegion,
0311 const Key& aKey,
0312 const GoldenPatternResult& aResult) {
0313 std::ostringstream stringStr;
0314
0315 xercesc::DOMElement* aGP = theDoc->createElement(_toDOMS("GP"));
0316 stringStr.str("");
0317 stringStr << aKey.thePt;
0318 aGP->setAttribute(_toDOMS("iPt"), _toDOMS(stringStr.str()));
0319 stringStr.str("");
0320 stringStr << aKey.theEtaCode;
0321 aGP->setAttribute(_toDOMS("iEta"), _toDOMS(stringStr.str()));
0322 stringStr.str("");
0323 stringStr << "0";
0324 aGP->setAttribute(_toDOMS("iPhi"), _toDOMS(stringStr.str()));
0325 stringStr.str("");
0326 stringStr << aKey.theCharge;
0327 aGP->setAttribute(_toDOMS("iCharge"), _toDOMS(stringStr.str()));
0328
0329
0330 {
0331 xercesc::DOMElement* aRefLayer = theDoc->createElement(_toDOMS("Result"));
0332 stringStr.str("");
0333 stringStr << aResult.getRefLayer();
0334 aRefLayer->setAttribute(_toDOMS("iRefLayer"), _toDOMS(stringStr.str()));
0335 stringStr.str("");
0336 stringStr << iRegion;
0337 aRefLayer->setAttribute(_toDOMS("iRegion"), _toDOMS(stringStr.str()));
0338 stringStr.str("");
0339 stringStr << myOMTFConfig->getRefToLogicNumber()[aResult.getRefLayer()];
0340 aRefLayer->setAttribute(_toDOMS("iLogicLayer"), _toDOMS(stringStr.str()));
0341 for (unsigned int iLogicLayer = 0; iLogicLayer < myOMTFConfig->nLayers(); ++iLogicLayer) {
0342 xercesc::DOMElement* aLayer = theDoc->createElement(_toDOMS("Layer"));
0343 stringStr.str("");
0344 stringStr << iLogicLayer;
0345 aLayer->setAttribute(_toDOMS("iLayer"), _toDOMS(stringStr.str()));
0346 stringStr.str("");
0347 stringStr << aResult.getStubResults()[iLogicLayer].getPdfVal();
0348 aLayer->setAttribute(_toDOMS("value"), _toDOMS(stringStr.str()));
0349 if (aResult.getStubResults()[iLogicLayer].getPdfVal())
0350 aRefLayer->appendChild(aLayer);
0351 }
0352 if (aRefLayer->getChildNodes()->getLength())
0353 aGP->appendChild(aRefLayer);
0354 }
0355 if (aGP->getChildNodes()->getLength())
0356 aTopElement->appendChild(aGP);
0357 }
0358
0359
0360 void XMLConfigWriter::writeGPData(GoldenPattern& aGP) {
0361 std::ostringstream stringStr;
0362 xercesc::DOMElement *aLayer = nullptr, *aRefLayer = nullptr, *aPdf = nullptr;
0363
0364 xercesc::DOMElement* aGPElement = theDoc->createElement(_toDOMS("GP"));
0365 stringStr.str("");
0366 stringStr << aGP.key().thePt;
0367 aGPElement->setAttribute(_toDOMS("iPt"), _toDOMS(stringStr.str()));
0368 stringStr.str("");
0369
0370 stringStr << "0";
0371 aGPElement->setAttribute(_toDOMS("iEta"), _toDOMS(stringStr.str()));
0372 stringStr.str("");
0373 stringStr << 0;
0374 aGPElement->setAttribute(_toDOMS("iPhi"), _toDOMS(stringStr.str()));
0375 stringStr.str("");
0376 stringStr << aGP.key().theCharge;
0377 aGPElement->setAttribute(_toDOMS("iCharge"), _toDOMS(stringStr.str()));
0378
0379 for (unsigned int iLayer = 0; iLayer < myOMTFConfig->nLayers(); ++iLayer) {
0380 int nOfPhis = 0;
0381
0382 aLayer = theDoc->createElement(_toDOMS("Layer"));
0383 stringStr.str("");
0384 stringStr << iLayer;
0385
0386 aLayer->setAttribute(_toDOMS("iLayer"), _toDOMS(stringStr.str()));
0387 stringStr.str("");
0388 stringStr << nOfPhis;
0389 aLayer->setAttribute(_toDOMS("nOfPhis"), _toDOMS(stringStr.str()));
0390 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0391 aRefLayer = theDoc->createElement(_toDOMS("RefLayer"));
0392 int meanDistPhi0 = aGP.getMeanDistPhi()[iLayer][iRefLayer][0];
0393 stringStr.str("");
0394 stringStr << meanDistPhi0;
0395 aRefLayer->setAttribute(_toDOMS("meanDistPhi0"), _toDOMS(stringStr.str()));
0396
0397 int meanDistPhi1 = aGP.getMeanDistPhi()[iLayer][iRefLayer][1];
0398 stringStr.str("");
0399 stringStr << meanDistPhi1;
0400 aRefLayer->setAttribute(_toDOMS("meanDistPhi1"), _toDOMS(stringStr.str()));
0401
0402 int selDistPhi = 0;
0403 stringStr.str("");
0404 stringStr << selDistPhi;
0405 aRefLayer->setAttribute(_toDOMS("selDistPhi"), _toDOMS(stringStr.str()));
0406
0407 int selDistPhiShift =
0408 aGP.getDistPhiBitShift(iLayer, iRefLayer);
0409 stringStr.str("");
0410 stringStr << selDistPhiShift;
0411 aRefLayer->setAttribute(_toDOMS("selDistPhiShift"), _toDOMS(stringStr.str()));
0412
0413 int distMsbPhiShift = 0;
0414 stringStr.str("");
0415 stringStr << distMsbPhiShift;
0416 aRefLayer->setAttribute(_toDOMS("distMsbPhiShift"), _toDOMS(stringStr.str()));
0417 aLayer->appendChild(aRefLayer);
0418 }
0419 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0420 for (unsigned int iPdf = 0; iPdf < exp2(myOMTFConfig->nPdfAddrBits()); ++iPdf) {
0421 aPdf = theDoc->createElement(_toDOMS("PDF"));
0422 stringStr.str("");
0423 stringStr << aGP.pdfValue(iLayer, iRefLayer, iPdf);
0424 aPdf->setAttribute(_toDOMS("value"), _toDOMS(stringStr.str()));
0425 aLayer->appendChild(aPdf);
0426 }
0427 }
0428 aGPElement->appendChild(aLayer);
0429 }
0430 theTopElement->appendChild(aGPElement);
0431 }
0432
0433
0434 void XMLConfigWriter::writeGPData(GoldenPattern* aGP1, GoldenPattern* aGP2, GoldenPattern* aGP3, GoldenPattern* aGP4) {
0435 std::ostringstream stringStr;
0436 auto setAttributeInt = [&](xercesc::DOMElement* domElement, std::string name, int value) -> void {
0437 stringStr << value;
0438 domElement->setAttribute(_toDOMS(name), _toDOMS(stringStr.str()));
0439 stringStr.str("");
0440 };
0441
0442 auto setAttributeFloat = [&](xercesc::DOMElement* domElement, std::string name, float value) -> void {
0443 stringStr << value;
0444 domElement->setAttribute(_toDOMS(name), _toDOMS(stringStr.str()));
0445 stringStr.str("");
0446 };
0447
0448
0449
0450 xercesc::DOMElement* aGPElement = theDoc->createElement(_toDOMS("GP"));
0451
0452 setAttributeInt(aGPElement, "iPt1", aGP1->key().thePt);
0453 setAttributeInt(aGPElement, "iPt2", aGP2->key().thePt);
0454 setAttributeInt(aGPElement, "iPt3", aGP3->key().thePt);
0455 setAttributeInt(aGPElement, "iPt4", aGP4->key().thePt);
0456
0457 if (writePdfThresholds) {
0458 if (dynamic_cast<const GoldenPatternWithThresh*>(aGP1) != nullptr) {
0459 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0460
0461 xercesc::DOMElement* aRefLayerThresh = theDoc->createElement(_toDOMS("RefLayerThresh"));
0462 setAttributeFloat(
0463 aRefLayerThresh, "tresh1", dynamic_cast<const GoldenPatternWithThresh*>(aGP1)->getThreshold(iRefLayer));
0464 setAttributeFloat(
0465 aRefLayerThresh, "tresh2", dynamic_cast<const GoldenPatternWithThresh*>(aGP2)->getThreshold(iRefLayer));
0466 setAttributeFloat(
0467 aRefLayerThresh, "tresh3", dynamic_cast<const GoldenPatternWithThresh*>(aGP3)->getThreshold(iRefLayer));
0468 setAttributeFloat(
0469 aRefLayerThresh, "tresh4", dynamic_cast<const GoldenPatternWithThresh*>(aGP4)->getThreshold(iRefLayer));
0470
0471 aGPElement->appendChild(aRefLayerThresh);
0472 }
0473 }
0474 }
0475
0476 setAttributeInt(aGPElement, "iEta", 0);
0477
0478 setAttributeInt(aGPElement, "iPhi", 0);
0479
0480 setAttributeInt(aGPElement, "iCharge", aGP1->key().theCharge);
0481
0482 for (unsigned int iLayer = 0; iLayer < myOMTFConfig->nLayers(); ++iLayer) {
0483 int nOfPhis = 0;
0484
0485 xercesc::DOMElement* aLayer = theDoc->createElement(_toDOMS("Layer"));
0486
0487 setAttributeInt(aLayer, "iLayer", iLayer);
0488 setAttributeInt(aLayer, "nOfPhis", nOfPhis);
0489
0490 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0491 xercesc::DOMElement* aRefLayer = theDoc->createElement(_toDOMS("RefLayer"));
0492
0493 if (writeMeanDistPhi1) {
0494 int meanDistPhi0 = aGP1->getMeanDistPhi()[iLayer][iRefLayer][0];
0495 setAttributeInt(aRefLayer, "meanDistPhi0", meanDistPhi0);
0496
0497 int meanDistPhi1 = aGP1->getMeanDistPhi()[iLayer][iRefLayer][1];
0498 setAttributeInt(aRefLayer, "meanDistPhi1", meanDistPhi1);
0499 } else {
0500 int meanDistPhi = aGP1->getMeanDistPhi()[iLayer][iRefLayer][0];
0501 setAttributeInt(aRefLayer, "meanDistPhi", meanDistPhi);
0502 }
0503
0504 int selDistPhi = 0;
0505 setAttributeInt(aRefLayer, "selDistPhi", selDistPhi);
0506
0507 int selDistPhiShift = aGP1->getDistPhiBitShift(
0508 iLayer, iRefLayer);
0509 setAttributeInt(aRefLayer, "selDistPhiShift", selDistPhiShift);
0510
0511 int distMsbPhiShift = 0;
0512 setAttributeInt(aRefLayer, "distMsbPhiShift", distMsbPhiShift);
0513
0514 aLayer->appendChild(aRefLayer);
0515 }
0516 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0517 for (unsigned int iPdf = 0; iPdf < exp2(myOMTFConfig->nPdfAddrBits()); ++iPdf) {
0518 xercesc::DOMElement* aPdf = theDoc->createElement(_toDOMS("PDF"));
0519
0520 setAttributeFloat(aPdf, "value1", aGP1->pdfValue(iLayer, iRefLayer, iPdf));
0521 setAttributeFloat(aPdf, "value2", aGP2->pdfValue(iLayer, iRefLayer, iPdf));
0522 setAttributeFloat(aPdf, "value3", aGP3->pdfValue(iLayer, iRefLayer, iPdf));
0523 setAttributeFloat(aPdf, "value4", aGP4->pdfValue(iLayer, iRefLayer, iPdf));
0524
0525 aLayer->appendChild(aPdf);
0526 }
0527 }
0528 aGPElement->appendChild(aLayer);
0529 }
0530 theTopElement->appendChild(aGPElement);
0531 }
0532
0533
0534 template <class GoldenPatternType>
0535 void XMLConfigWriter::writeGPs(const GoldenPatternVec<GoldenPatternType>& goldenPats, std::string fName) {
0536 initialiseXMLDocument("OMTF");
0537 GoldenPattern* dummy = new GoldenPatternWithThresh(Key(0, 0, 0), myOMTFConfig);
0538
0539 OMTFConfiguration::vector2D mergedPartters = myOMTFConfig->getPatternGroups(goldenPats);
0540 for (unsigned int iGroup = 0; iGroup < mergedPartters.size(); iGroup++) {
0541 std::vector<GoldenPattern*> gps(4, dummy);
0542 for (unsigned int i = 0; i < mergedPartters[iGroup].size(); i++) {
0543 GoldenPattern* gp = dynamic_cast<GoldenPattern*>(goldenPats.at(mergedPartters[iGroup][i]).get());
0544 if (!gp) {
0545 throw cms::Exception("OMTF::XMLConfigWriter::writeGPs: the gps are not GoldenPatterns ");
0546 }
0547 gps[i] = gp;
0548 }
0549 writeGPData(gps[0], gps[1], gps[2], gps[3]);
0550 }
0551 finaliseXMLDocument(fName);
0552 }
0553
0554
0555 void XMLConfigWriter::writeConnectionsData(
0556 const std::vector<std::vector<OMTFConfiguration::vector2D> >& measurements4D) {
0557 std::ostringstream stringStr;
0558
0559 for (unsigned int iProcessor = 0; iProcessor < myOMTFConfig->nProcessors(); ++iProcessor) {
0560 xercesc::DOMElement* aProcessorElement = theDoc->createElement(_toDOMS("Processor"));
0561 stringStr.str("");
0562 stringStr << iProcessor;
0563 aProcessorElement->setAttribute(_toDOMS("iProcessor"), _toDOMS(stringStr.str()));
0564 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0565 xercesc::DOMElement* aRefLayerElement = theDoc->createElement(_toDOMS("RefLayer"));
0566 stringStr.str("");
0567 stringStr << iRefLayer;
0568 aRefLayerElement->setAttribute(_toDOMS("iRefLayer"), _toDOMS(stringStr.str()));
0569 stringStr.str("");
0570 stringStr << myOMTFConfig->getProcessorPhiVsRefLayer()[iProcessor][iRefLayer];
0571 aRefLayerElement->setAttribute(_toDOMS("iGlobalPhiStart"), _toDOMS(stringStr.str()));
0572 aProcessorElement->appendChild(aRefLayerElement);
0573 }
0574 unsigned int iRefHit = 0;
0575
0576 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0577 for (unsigned int iRegion = 0; iRegion < myOMTFConfig->nLogicRegions(); ++iRegion) {
0578 unsigned int maxHitCount = 0;
0579 for (unsigned int iInput = 0; iInput < myOMTFConfig->nInputs(); ++iInput) {
0580 if ((int)maxHitCount < myOMTFConfig->getMeasurements4Dref()[iProcessor][iRegion][iRefLayer][iInput])
0581 maxHitCount = myOMTFConfig->getMeasurements4Dref()[iProcessor][iRegion][iRefLayer][iInput];
0582 }
0583 for (unsigned int iInput = 0; iInput < myOMTFConfig->nInputs(); ++iInput) {
0584 unsigned int hitCount = myOMTFConfig->getMeasurements4Dref()[iProcessor][iRegion][iRefLayer][iInput];
0585 if (hitCount < maxHitCount * 0.1)
0586 continue;
0587 xercesc::DOMElement* aRefHitElement = theDoc->createElement(_toDOMS("RefHit"));
0588 stringStr.str("");
0589 stringStr << iRefHit;
0590 aRefHitElement->setAttribute(_toDOMS("iRefHit"), _toDOMS(stringStr.str()));
0591 stringStr.str("");
0592 stringStr << iRefLayer;
0593 aRefHitElement->setAttribute(_toDOMS("iRefLayer"), _toDOMS(stringStr.str()));
0594
0595 stringStr.str("");
0596 stringStr << iRegion;
0597 aRefHitElement->setAttribute(_toDOMS("iRegion"), _toDOMS(stringStr.str()));
0598
0599 stringStr.str("");
0600 stringStr << iInput;
0601 aRefHitElement->setAttribute(_toDOMS("iInput"), _toDOMS(stringStr.str()));
0602 unsigned int logicRegionSize = 10 / 360.0 * myOMTFConfig->nPhiBins();
0603 int lowScaleEnd = std::pow(2, myOMTFConfig->nPhiBits() - 1);
0604
0605 int iPhiMin = myOMTFConfig->getProcessorPhiVsRefLayer()[iProcessor][iRefLayer] -
0606 myOMTFConfig->globalPhiStart(iProcessor) - lowScaleEnd;
0607 int iPhiMax = iPhiMin + logicRegionSize - 1;
0608
0609 iPhiMin += iRegion * logicRegionSize;
0610 iPhiMax += iRegion * logicRegionSize;
0611
0612 stringStr.str("");
0613 stringStr << iPhiMin;
0614 aRefHitElement->setAttribute(_toDOMS("iPhiMin"), _toDOMS(stringStr.str()));
0615
0616 stringStr.str("");
0617 stringStr << iPhiMax;
0618 aRefHitElement->setAttribute(_toDOMS("iPhiMax"), _toDOMS(stringStr.str()));
0619 if (iRefHit < myOMTFConfig->nRefHits())
0620 aProcessorElement->appendChild(aRefHitElement);
0621 ++iRefHit;
0622 }
0623 for (; iRegion == 5 && iRefLayer == 7 && iRefHit < myOMTFConfig->nRefHits(); ++iRefHit) {
0624 xercesc::DOMElement* aRefHitElement = theDoc->createElement(_toDOMS("RefHit"));
0625 stringStr.str("");
0626 stringStr << iRefHit;
0627 aRefHitElement->setAttribute(_toDOMS("iRefHit"), _toDOMS(stringStr.str()));
0628 stringStr.str("");
0629 stringStr << 0;
0630 aRefHitElement->setAttribute(_toDOMS("iRefLayer"), _toDOMS(stringStr.str()));
0631
0632 stringStr.str("");
0633 stringStr << 0;
0634 aRefHitElement->setAttribute(_toDOMS("iRegion"), _toDOMS(stringStr.str()));
0635
0636 stringStr.str("");
0637 stringStr << 0;
0638 aRefHitElement->setAttribute(_toDOMS("iInput"), _toDOMS(stringStr.str()));
0639
0640 int iPhiMin = 0;
0641 int iPhiMax = 1;
0642
0643 stringStr.str("");
0644 stringStr << iPhiMin;
0645 aRefHitElement->setAttribute(_toDOMS("iPhiMin"), _toDOMS(stringStr.str()));
0646
0647 stringStr.str("");
0648 stringStr << iPhiMax;
0649 aRefHitElement->setAttribute(_toDOMS("iPhiMax"), _toDOMS(stringStr.str()));
0650
0651 aProcessorElement->appendChild(aRefHitElement);
0652 }
0653 }
0654 }
0655
0656 for (unsigned int iRegion = 0; iRegion < myOMTFConfig->nLogicRegions(); ++iRegion) {
0657 xercesc::DOMElement* aRegionElement = theDoc->createElement(_toDOMS("LogicRegion"));
0658 stringStr.str("");
0659 stringStr << iRegion;
0660 aRegionElement->setAttribute(_toDOMS("iRegion"), _toDOMS(stringStr.str()));
0661
0662 for (unsigned int iLogicLayer = 0; iLogicLayer < myOMTFConfig->nLayers(); ++iLogicLayer) {
0663 xercesc::DOMElement* aLayerElement = theDoc->createElement(_toDOMS("Layer"));
0664 stringStr.str("");
0665 stringStr << iLogicLayer;
0666
0667 aLayerElement->setAttribute(_toDOMS("iLayer"), _toDOMS(stringStr.str()));
0668 const OMTFConfiguration::vector1D& myCounts =
0669 myOMTFConfig->getMeasurements4D()[iProcessor][iRegion][iLogicLayer];
0670 unsigned int maxInput = findMaxInput(myCounts);
0671 unsigned int begin = 0, end = 0;
0672 if ((int)maxInput - 2 >= 0)
0673 begin = maxInput - 2;
0674 else
0675 begin = maxInput;
0676 end = maxInput + 3;
0677 stringStr.str("");
0678 stringStr << begin;
0679 aLayerElement->setAttribute(_toDOMS("iFirstInput"), _toDOMS(stringStr.str()));
0680 stringStr.str("");
0681 stringStr << end - begin + 1;
0682 aLayerElement->setAttribute(_toDOMS("nInputs"), _toDOMS(stringStr.str()));
0683 aRegionElement->appendChild(aLayerElement);
0684 }
0685 aProcessorElement->appendChild(aRegionElement);
0686 }
0687 theTopElement->appendChild(aProcessorElement);
0688 }
0689 }
0690
0691
0692 unsigned int XMLConfigWriter::findMaxInput(const OMTFConfiguration::vector1D& myCounts) {
0693 unsigned int max = 0;
0694 unsigned int maxInput = 0;
0695 for (unsigned int iInput = 0; iInput < myOMTFConfig->nInputs(); ++iInput) {
0696 if (myCounts[iInput] > (int)max) {
0697 max = myCounts[iInput];
0698 maxInput = iInput;
0699 }
0700 }
0701 return maxInput;
0702 }
0703
0704
0705 template void XMLConfigWriter::writeGPs(const GoldenPatternVec<GoldenPattern>& goldenPats, std::string fName);
0706
0707 template void XMLConfigWriter::writeGPs(const GoldenPatternVec<GoldenPatternWithStat>& goldenPats, std::string fName);
0708
0709 template void XMLConfigWriter::writeGPs(const GoldenPatternVec<GoldenPatternWithThresh>& goldenPats, std::string fName);