File indexing completed on 2025-05-27 01:56:23
0001 #include "FWCore/Framework/interface/Event.h"
0002
0003 #include "L1Trigger/L1TMuonOverlap/interface/XMLConfigWriter.h"
0004 #include "L1Trigger/L1TMuonOverlap/interface/GoldenPattern.h"
0005 #include "L1Trigger/L1TMuonOverlap/interface/OMTFinput.h"
0006 #include "L1Trigger/L1TMuonOverlap/interface/OMTFConfiguration.h"
0007 #include "L1Trigger/L1TMuonOverlap/interface/OMTFResult.h"
0008
0009 #include "L1Trigger/L1TMuonOverlap/interface/AlgoMuon.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) {
0091 cms::concurrency::xercesInitialize();
0092
0093
0094 domImpl = DOMImplementationRegistry::getDOMImplementation(_toDOMS("Range"));
0095
0096 myOMTFConfig = aOMTFConfig;
0097 }
0098
0099
0100 XMLConfigWriter::~XMLConfigWriter() { cms::concurrency::xercesTerminate(); }
0101
0102
0103 void XMLConfigWriter::initialiseXMLDocument(const std::string& docName) {
0104 theDoc = domImpl->createDocument(nullptr, _toDOMS(docName), nullptr);
0105 theTopElement = theDoc->getDocumentElement();
0106
0107 unsigned int version = myOMTFConfig->patternsVersion();
0108 unsigned int mask16bits = 0xFFFF;
0109
0110 version &= mask16bits;
0111
0112 std::ostringstream stringStr;
0113 stringStr.str("");
0114 stringStr << "0x" << std::hex << std::setfill('0') << std::setw(4) << version;
0115 theTopElement->setAttribute(_toDOMS("version"), _toDOMS(stringStr.str()));
0116 }
0117
0118
0119 void XMLConfigWriter::finaliseXMLDocument(const std::string& fName) {
0120 XMLFormatTarget* formTarget = new LocalFileFormatTarget(fName.c_str());
0121
0122 #if _XERCES_VERSION < 30100
0123 xercesc::DOMWriter* domWriter = (dynamic_cast<DOMImplementation*>(domImpl))->createDOMWriter();
0124 if (domWriter->canSetFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true)) {
0125 domWriter->setFeature(XMLUni::fgDOMWRTFormatPrettyPrint, true);
0126 }
0127 domWriter->writeNode(formTarget, *theTopElement);
0128
0129 #else
0130 xercesc::DOMLSSerializer* theSerializer = (dynamic_cast<DOMImplementation*>(domImpl))->createLSSerializer();
0131 if (theSerializer->getDomConfig()->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true))
0132 theSerializer->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true);
0133 DOMLSOutput* theOutput = (dynamic_cast<DOMImplementation*>(domImpl))->createLSOutput();
0134 theOutput->setByteStream(formTarget);
0135 theSerializer->write(theTopElement, theOutput);
0136 theOutput->release();
0137 theSerializer->release();
0138 #endif
0139
0140 delete formTarget;
0141 }
0142
0143
0144 xercesc::DOMElement* XMLConfigWriter::writeEventHeader(unsigned int eventId, unsigned int mixedEventId) {
0145 unsigned int eventBx = eventId * 2;
0146
0147 xercesc::DOMElement* aEvent = nullptr;
0148 xercesc::DOMElement* aBx = nullptr;
0149 std::ostringstream stringStr;
0150
0151 aEvent = theDoc->createElement(_toDOMS("Event"));
0152
0153 stringStr.str("");
0154 stringStr << eventId;
0155 aEvent->setAttribute(_toDOMS("iEvent"), _toDOMS(stringStr.str()));
0156
0157 stringStr.str("");
0158 stringStr << mixedEventId;
0159 aEvent->setAttribute(_toDOMS("iMixedEvent"), _toDOMS(stringStr.str()));
0160
0161 aBx = theDoc->createElement(_toDOMS("bx"));
0162 stringStr.str("");
0163 stringStr << eventBx;
0164 aBx->setAttribute(_toDOMS("iBx"), _toDOMS(stringStr.str()));
0165 aEvent->appendChild(aBx);
0166
0167 theTopElement->appendChild(aEvent);
0168
0169 return aBx;
0170 }
0171
0172
0173 xercesc::DOMElement* XMLConfigWriter::writeEventData(xercesc::DOMElement* aTopElement,
0174 const OmtfName& board,
0175 const OMTFinput& aInput) {
0176 std::ostringstream stringStr;
0177
0178 xercesc::DOMElement* aProcessor = theDoc->createElement(_toDOMS("Processor"));
0179 aProcessor->setAttribute(_toDOMS("board"), _toDOMS(board.name()));
0180
0181 unsigned int iProcessor = board.processor();
0182 stringStr.str("");
0183 stringStr << iProcessor;
0184 aProcessor->setAttribute(_toDOMS("iProcessor"), _toDOMS(stringStr.str()));
0185 stringStr.str("");
0186 if (board.position() == 1)
0187 stringStr << "+";
0188 stringStr << board.position();
0189 aProcessor->setAttribute(_toDOMS("position"), _toDOMS(stringStr.str()));
0190
0191 xercesc::DOMElement *aLayer, *aHit;
0192 for (unsigned int iLayer = 0; iLayer < myOMTFConfig->nLayers(); ++iLayer) {
0193 const OMTFinput::vector1D& layerDataPhi = aInput.getLayerData(iLayer);
0194 const OMTFinput::vector1D& layerDataEta = aInput.getLayerData(iLayer, true);
0195
0196 aLayer = theDoc->createElement(_toDOMS("Layer"));
0197 stringStr.str("");
0198 stringStr << iLayer;
0199 aLayer->setAttribute(_toDOMS("iLayer"), _toDOMS(stringStr.str()));
0200 for (unsigned int iHit = 0; iHit < layerDataPhi.size(); ++iHit) {
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 << layerDataPhi[iHit];
0207 aHit->setAttribute(_toDOMS("iPhi"), _toDOMS(stringStr.str()));
0208 stringStr.str("");
0209 stringStr << eta2Bits(abs(layerDataEta[iHit]));
0210 aHit->setAttribute(_toDOMS("iEta"), _toDOMS(stringStr.str()));
0211 if (layerDataPhi[iHit] >= (int)myOMTFConfig->nPhiBins())
0212 continue;
0213 aLayer->appendChild(aHit);
0214 }
0215 if (aLayer->getChildNodes()->getLength())
0216 aProcessor->appendChild(aLayer);
0217 }
0218
0219 aTopElement->appendChild(aProcessor);
0220 return aProcessor;
0221 }
0222
0223
0224 void XMLConfigWriter::writeAlgoMuon(xercesc::DOMElement* aTopElement, unsigned int iRefHit, const AlgoMuon& aCand) {
0225 xercesc::DOMElement* aResult = theDoc->createElement(_toDOMS("AlgoMuon"));
0226 std::ostringstream stringStr;
0227 stringStr.str("");
0228 stringStr << iRefHit;
0229 aResult->setAttribute(_toDOMS("iRefHit"), _toDOMS(stringStr.str()));
0230 stringStr.str("");
0231 stringStr << aCand.getPt();
0232 aResult->setAttribute(_toDOMS("ptCode"), _toDOMS(stringStr.str()));
0233 stringStr.str("");
0234 stringStr << aCand.getPhi();
0235 aResult->setAttribute(_toDOMS("phiCode"), _toDOMS(stringStr.str()));
0236 stringStr.str("");
0237 stringStr << eta2Bits(abs(aCand.getEta()));
0238 aResult->setAttribute(_toDOMS("etaCode"), _toDOMS(stringStr.str()));
0239 stringStr.str("");
0240 stringStr << aCand.getCharge();
0241 aResult->setAttribute(_toDOMS("charge"), _toDOMS(stringStr.str()));
0242 stringStr.str("");
0243 stringStr << aCand.getQ();
0244 aResult->setAttribute(_toDOMS("nHits"), _toDOMS(stringStr.str()));
0245 stringStr.str("");
0246 stringStr << aCand.getDisc();
0247 aResult->setAttribute(_toDOMS("disc"), _toDOMS(stringStr.str()));
0248 stringStr.str("");
0249 stringStr << aCand.getRefLayer();
0250 aResult->setAttribute(_toDOMS("iRefLayer"), _toDOMS(stringStr.str()));
0251 stringStr.str("");
0252 stringStr << std::bitset<18>(aCand.getHits());
0253 aResult->setAttribute(_toDOMS("layers"), _toDOMS(stringStr.str()));
0254 stringStr.str("");
0255 stringStr << aCand.getPhiRHit();
0256 aResult->setAttribute(_toDOMS("phiRHit"), _toDOMS(stringStr.str()));
0257 stringStr.str("");
0258 stringStr << aCand.getPatternNumber();
0259 aResult->setAttribute(_toDOMS("patNum"), _toDOMS(stringStr.str()));
0260
0261 aTopElement->appendChild(aResult);
0262 }
0263
0264
0265 void XMLConfigWriter::writeCandMuon(xercesc::DOMElement* aTopElement, const l1t::RegionalMuonCand& aCand) {
0266 xercesc::DOMElement* aResult = theDoc->createElement(_toDOMS("CandMuon"));
0267 std::ostringstream stringStr;
0268 stringStr.str("");
0269 stringStr << aCand.hwPt();
0270 aResult->setAttribute(_toDOMS("hwPt"), _toDOMS(stringStr.str()));
0271 stringStr.str("");
0272 stringStr << aCand.hwPhi();
0273 aResult->setAttribute(_toDOMS("hwPhi"), _toDOMS(stringStr.str()));
0274 stringStr.str("");
0275 stringStr << aCand.hwEta();
0276 aResult->setAttribute(_toDOMS("hwEta"), _toDOMS(stringStr.str()));
0277 stringStr.str("");
0278 stringStr << aCand.hwSign();
0279 aResult->setAttribute(_toDOMS("hwSign"), _toDOMS(stringStr.str()));
0280 stringStr.str("");
0281 stringStr << aCand.hwSignValid();
0282 aResult->setAttribute(_toDOMS("hwSignValid"), _toDOMS(stringStr.str()));
0283 stringStr.str("");
0284 stringStr << aCand.hwQual();
0285 aResult->setAttribute(_toDOMS("hwQual"), _toDOMS(stringStr.str()));
0286 stringStr.str("");
0287 std::map<int, int> hwAddrMap = aCand.trackAddress();
0288 stringStr << std::bitset<29>(hwAddrMap[0]);
0289 aResult->setAttribute(_toDOMS("hwTrackAddress"), _toDOMS(stringStr.str()));
0290 stringStr.str("");
0291 stringStr << aCand.link();
0292 aResult->setAttribute(_toDOMS("link"), _toDOMS(stringStr.str()));
0293 stringStr.str("");
0294 stringStr << aCand.processor();
0295 aResult->setAttribute(_toDOMS("processor"), _toDOMS(stringStr.str()));
0296 stringStr.str("");
0297 if (aCand.trackFinderType() == l1t::omtf_neg)
0298 stringStr << "OMTF_NEG";
0299 else if (aCand.trackFinderType() == l1t::omtf_pos)
0300 stringStr << "OMTF_POS";
0301 else
0302 stringStr << aCand.trackFinderType();
0303 aResult->setAttribute(_toDOMS("trackFinderType"), _toDOMS(stringStr.str()));
0304 aTopElement->appendChild(aResult);
0305 }
0306
0307
0308
0309
0310 void XMLConfigWriter::writeResultsData(xercesc::DOMElement* aTopElement,
0311 unsigned int iRegion,
0312 const Key& aKey,
0313 const OMTFResult& aResult) {
0314 OMTFResult::vector2D results = aResult.getResults();
0315
0316 std::ostringstream stringStr;
0317
0318 xercesc::DOMElement* aGP = theDoc->createElement(_toDOMS("GP"));
0319 stringStr.str("");
0320 stringStr << aKey.thePtCode;
0321 aGP->setAttribute(_toDOMS("iPt"), _toDOMS(stringStr.str()));
0322 stringStr.str("");
0323 stringStr << aKey.theEtaCode;
0324 aGP->setAttribute(_toDOMS("iEta"), _toDOMS(stringStr.str()));
0325 stringStr.str("");
0326 stringStr << "0";
0327 aGP->setAttribute(_toDOMS("iPhi"), _toDOMS(stringStr.str()));
0328 stringStr.str("");
0329 stringStr << aKey.theCharge;
0330 aGP->setAttribute(_toDOMS("iCharge"), _toDOMS(stringStr.str()));
0331
0332
0333 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0334 xercesc::DOMElement* aRefLayer = theDoc->createElement(_toDOMS("Result"));
0335 stringStr.str("");
0336 stringStr << iRefLayer;
0337 aRefLayer->setAttribute(_toDOMS("iRefLayer"), _toDOMS(stringStr.str()));
0338 stringStr.str("");
0339 stringStr << iRegion;
0340 aRefLayer->setAttribute(_toDOMS("iRegion"), _toDOMS(stringStr.str()));
0341 stringStr.str("");
0342 stringStr << myOMTFConfig->getRefToLogicNumber()[iRefLayer];
0343 aRefLayer->setAttribute(_toDOMS("iLogicLayer"), _toDOMS(stringStr.str()));
0344 for (unsigned int iLogicLayer = 0; iLogicLayer < myOMTFConfig->nLayers(); ++iLogicLayer) {
0345 xercesc::DOMElement* aLayer = theDoc->createElement(_toDOMS("Layer"));
0346 stringStr.str("");
0347 stringStr << iLogicLayer;
0348 aLayer->setAttribute(_toDOMS("iLayer"), _toDOMS(stringStr.str()));
0349 stringStr.str("");
0350 stringStr << results[iLogicLayer][iRefLayer];
0351 aLayer->setAttribute(_toDOMS("value"), _toDOMS(stringStr.str()));
0352 if (results[iLogicLayer][iRefLayer])
0353 aRefLayer->appendChild(aLayer);
0354 }
0355 if (aRefLayer->getChildNodes()->getLength())
0356 aGP->appendChild(aRefLayer);
0357 }
0358 if (aGP->getChildNodes()->getLength())
0359 aTopElement->appendChild(aGP);
0360 }
0361
0362
0363 void XMLConfigWriter::writeGPData(const GoldenPattern& aGP) {
0364 std::ostringstream stringStr;
0365 xercesc::DOMElement *aLayer = nullptr, *aRefLayer = nullptr, *aPdf = nullptr;
0366
0367 xercesc::DOMElement* aGPElement = theDoc->createElement(_toDOMS("GP"));
0368 stringStr.str("");
0369 stringStr << aGP.key().thePtCode;
0370 aGPElement->setAttribute(_toDOMS("iPt"), _toDOMS(stringStr.str()));
0371 stringStr.str("");
0372
0373 stringStr << "0";
0374 aGPElement->setAttribute(_toDOMS("iEta"), _toDOMS(stringStr.str()));
0375 stringStr.str("");
0376 stringStr << 0;
0377 aGPElement->setAttribute(_toDOMS("iPhi"), _toDOMS(stringStr.str()));
0378 stringStr.str("");
0379 stringStr << aGP.key().theCharge;
0380 aGPElement->setAttribute(_toDOMS("iCharge"), _toDOMS(stringStr.str()));
0381
0382 for (unsigned int iLayer = 0; iLayer < myOMTFConfig->nLayers(); ++iLayer) {
0383 int nOfPhis = 0;
0384
0385 aLayer = theDoc->createElement(_toDOMS("Layer"));
0386 stringStr.str("");
0387 stringStr << iLayer;
0388
0389 aLayer->setAttribute(_toDOMS("iLayer"), _toDOMS(stringStr.str()));
0390 stringStr.str("");
0391 stringStr << nOfPhis;
0392 aLayer->setAttribute(_toDOMS("nOfPhis"), _toDOMS(stringStr.str()));
0393 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0394 aRefLayer = theDoc->createElement(_toDOMS("RefLayer"));
0395 int meanDistPhi = aGP.meanDistPhiValue(iLayer, iRefLayer);
0396 stringStr.str("");
0397 stringStr << meanDistPhi;
0398 aRefLayer->setAttribute(_toDOMS("meanDistPhi"), _toDOMS(stringStr.str()));
0399 int selDistPhi = 0;
0400 stringStr.str("");
0401 stringStr << selDistPhi;
0402 aRefLayer->setAttribute(_toDOMS("selDistPhi"), _toDOMS(stringStr.str()));
0403 int selDistPhiShift = 0;
0404 stringStr.str("");
0405 stringStr << selDistPhiShift;
0406 aRefLayer->setAttribute(_toDOMS("selDistPhiShift"), _toDOMS(stringStr.str()));
0407 int distMsbPhiShift = 0;
0408 stringStr.str("");
0409 stringStr << distMsbPhiShift;
0410 aRefLayer->setAttribute(_toDOMS("distMsbPhiShift"), _toDOMS(stringStr.str()));
0411 aLayer->appendChild(aRefLayer);
0412 }
0413 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0414 for (unsigned int iPdf = 0; iPdf < exp2(myOMTFConfig->nPdfAddrBits()); ++iPdf) {
0415 aPdf = theDoc->createElement(_toDOMS("PDF"));
0416 stringStr.str("");
0417 stringStr << aGP.pdfValue(iLayer, iRefLayer, iPdf);
0418 aPdf->setAttribute(_toDOMS("value"), _toDOMS(stringStr.str()));
0419 aLayer->appendChild(aPdf);
0420 }
0421 }
0422 aGPElement->appendChild(aLayer);
0423 }
0424 theTopElement->appendChild(aGPElement);
0425 }
0426
0427
0428 void XMLConfigWriter::writeGPData(const GoldenPattern& aGP1,
0429 const GoldenPattern& aGP2,
0430 const GoldenPattern& aGP3,
0431 const GoldenPattern& aGP4) {
0432 std::ostringstream stringStr;
0433 xercesc::DOMElement *aLayer = nullptr, *aRefLayer = nullptr, *aPdf = nullptr;
0434
0435 xercesc::DOMElement* aGPElement = theDoc->createElement(_toDOMS("GP"));
0436 stringStr.str("");
0437
0438 stringStr << aGP1.key().thePtCode;
0439 aGPElement->setAttribute(_toDOMS("iPt1"), _toDOMS(stringStr.str()));
0440 stringStr.str("");
0441
0442 stringStr << aGP2.key().thePtCode;
0443 aGPElement->setAttribute(_toDOMS("iPt2"), _toDOMS(stringStr.str()));
0444 stringStr.str("");
0445
0446 stringStr << aGP3.key().thePtCode;
0447 aGPElement->setAttribute(_toDOMS("iPt3"), _toDOMS(stringStr.str()));
0448 stringStr.str("");
0449
0450 stringStr << aGP4.key().thePtCode;
0451 aGPElement->setAttribute(_toDOMS("iPt4"), _toDOMS(stringStr.str()));
0452
0453 stringStr.str("");
0454
0455 stringStr << "0";
0456 aGPElement->setAttribute(_toDOMS("iEta"), _toDOMS(stringStr.str()));
0457 stringStr.str("");
0458 stringStr << "0";
0459 aGPElement->setAttribute(_toDOMS("iPhi"), _toDOMS(stringStr.str()));
0460 stringStr.str("");
0461 stringStr << aGP1.key().theCharge;
0462
0463 aGPElement->setAttribute(_toDOMS("iCharge"), _toDOMS(stringStr.str()));
0464
0465 for (unsigned int iLayer = 0; iLayer < myOMTFConfig->nLayers(); ++iLayer) {
0466 int nOfPhis = 0;
0467
0468 aLayer = theDoc->createElement(_toDOMS("Layer"));
0469 stringStr.str("");
0470 stringStr << iLayer;
0471
0472 aLayer->setAttribute(_toDOMS("iLayer"), _toDOMS(stringStr.str()));
0473 stringStr.str("");
0474 stringStr << nOfPhis;
0475 aLayer->setAttribute(_toDOMS("nOfPhis"), _toDOMS(stringStr.str()));
0476 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0477 aRefLayer = theDoc->createElement(_toDOMS("RefLayer"));
0478 int meanDistPhi = aGP1.meanDistPhiValue(iLayer, iRefLayer);
0479
0480 stringStr.str("");
0481 stringStr << meanDistPhi;
0482 aRefLayer->setAttribute(_toDOMS("meanDistPhi"), _toDOMS(stringStr.str()));
0483
0484
0485
0486
0487
0488
0489 int selDistPhi = 0;
0490 stringStr.str("");
0491 stringStr << selDistPhi;
0492 aRefLayer->setAttribute(_toDOMS("selDistPhi"), _toDOMS(stringStr.str()));
0493 int selDistPhiShift = 0;
0494 stringStr.str("");
0495 stringStr << selDistPhiShift;
0496 aRefLayer->setAttribute(_toDOMS("selDistPhiShift"), _toDOMS(stringStr.str()));
0497 int distMsbPhiShift = 0;
0498 stringStr.str("");
0499 stringStr << distMsbPhiShift;
0500 aRefLayer->setAttribute(_toDOMS("distMsbPhiShift"), _toDOMS(stringStr.str()));
0501 aLayer->appendChild(aRefLayer);
0502 }
0503 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0504 for (unsigned int iPdf = 0; iPdf < exp2(myOMTFConfig->nPdfAddrBits()); ++iPdf) {
0505 aPdf = theDoc->createElement(_toDOMS("PDF"));
0506 stringStr.str("");
0507 stringStr << aGP1.pdfValue(iLayer, iRefLayer, iPdf);
0508 aPdf->setAttribute(_toDOMS("value1"), _toDOMS(stringStr.str()));
0509 stringStr.str("");
0510 stringStr << aGP2.pdfValue(iLayer, iRefLayer, iPdf);
0511 aPdf->setAttribute(_toDOMS("value2"), _toDOMS(stringStr.str()));
0512 stringStr.str("");
0513 stringStr << aGP3.pdfValue(iLayer, iRefLayer, iPdf);
0514 aPdf->setAttribute(_toDOMS("value3"), _toDOMS(stringStr.str()));
0515 stringStr.str("");
0516 stringStr << aGP4.pdfValue(iLayer, iRefLayer, iPdf);
0517 aPdf->setAttribute(_toDOMS("value4"), _toDOMS(stringStr.str()));
0518 aLayer->appendChild(aPdf);
0519 }
0520 }
0521 aGPElement->appendChild(aLayer);
0522 }
0523 theTopElement->appendChild(aGPElement);
0524 }
0525
0526
0527 void XMLConfigWriter::writeConnectionsData(
0528 const std::vector<std::vector<OMTFConfiguration::vector2D> >& measurements4D) {
0529 std::ostringstream stringStr;
0530
0531 for (unsigned int iProcessor = 0; iProcessor < 6; ++iProcessor) {
0532 xercesc::DOMElement* aProcessorElement = theDoc->createElement(_toDOMS("Processor"));
0533 stringStr.str("");
0534 stringStr << iProcessor;
0535 aProcessorElement->setAttribute(_toDOMS("iProcessor"), _toDOMS(stringStr.str()));
0536 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0537 xercesc::DOMElement* aRefLayerElement = theDoc->createElement(_toDOMS("RefLayer"));
0538 stringStr.str("");
0539 stringStr << iRefLayer;
0540 aRefLayerElement->setAttribute(_toDOMS("iRefLayer"), _toDOMS(stringStr.str()));
0541 stringStr.str("");
0542 stringStr << myOMTFConfig->getProcessorPhiVsRefLayer()[iProcessor][iRefLayer];
0543 aRefLayerElement->setAttribute(_toDOMS("iGlobalPhiStart"), _toDOMS(stringStr.str()));
0544 aProcessorElement->appendChild(aRefLayerElement);
0545 }
0546 unsigned int iRefHit = 0;
0547
0548 for (unsigned int iRefLayer = 0; iRefLayer < myOMTFConfig->nRefLayers(); ++iRefLayer) {
0549 for (unsigned int iRegion = 0; iRegion < 6; ++iRegion) {
0550 unsigned int maxHitCount = 0;
0551 for (unsigned int iInput = 0; iInput < 14; ++iInput) {
0552 if ((int)maxHitCount < myOMTFConfig->getMeasurements4Dref()[iProcessor][iRegion][iRefLayer][iInput])
0553 maxHitCount = myOMTFConfig->getMeasurements4Dref()[iProcessor][iRegion][iRefLayer][iInput];
0554 }
0555 for (unsigned int iInput = 0; iInput < 14; ++iInput) {
0556 unsigned int hitCount = myOMTFConfig->getMeasurements4Dref()[iProcessor][iRegion][iRefLayer][iInput];
0557 if (hitCount < maxHitCount * 0.1)
0558 continue;
0559 xercesc::DOMElement* aRefHitElement = theDoc->createElement(_toDOMS("RefHit"));
0560 stringStr.str("");
0561 stringStr << iRefHit;
0562 aRefHitElement->setAttribute(_toDOMS("iRefHit"), _toDOMS(stringStr.str()));
0563 stringStr.str("");
0564 stringStr << iRefLayer;
0565 aRefHitElement->setAttribute(_toDOMS("iRefLayer"), _toDOMS(stringStr.str()));
0566
0567 stringStr.str("");
0568 stringStr << iRegion;
0569 aRefHitElement->setAttribute(_toDOMS("iRegion"), _toDOMS(stringStr.str()));
0570
0571 stringStr.str("");
0572 stringStr << iInput;
0573 aRefHitElement->setAttribute(_toDOMS("iInput"), _toDOMS(stringStr.str()));
0574 unsigned int logicRegionSize = 10 / 360.0 * myOMTFConfig->nPhiBins();
0575 int lowScaleEnd = std::pow(2, myOMTFConfig->nPhiBits() - 1);
0576
0577 int iPhiMin = myOMTFConfig->getProcessorPhiVsRefLayer()[iProcessor][iRefLayer] -
0578 myOMTFConfig->globalPhiStart(iProcessor) - lowScaleEnd;
0579 int iPhiMax = iPhiMin + logicRegionSize - 1;
0580
0581 iPhiMin += iRegion * logicRegionSize;
0582 iPhiMax += iRegion * logicRegionSize;
0583
0584 stringStr.str("");
0585 stringStr << iPhiMin;
0586 aRefHitElement->setAttribute(_toDOMS("iPhiMin"), _toDOMS(stringStr.str()));
0587
0588 stringStr.str("");
0589 stringStr << iPhiMax;
0590 aRefHitElement->setAttribute(_toDOMS("iPhiMax"), _toDOMS(stringStr.str()));
0591 if (iRefHit < myOMTFConfig->nRefHits())
0592 aProcessorElement->appendChild(aRefHitElement);
0593 ++iRefHit;
0594 }
0595 for (; iRegion == 5 && iRefLayer == 7 && iRefHit < myOMTFConfig->nRefHits(); ++iRefHit) {
0596 xercesc::DOMElement* aRefHitElement = theDoc->createElement(_toDOMS("RefHit"));
0597 stringStr.str("");
0598 stringStr << iRefHit;
0599 aRefHitElement->setAttribute(_toDOMS("iRefHit"), _toDOMS(stringStr.str()));
0600 stringStr.str("");
0601 stringStr << 0;
0602 aRefHitElement->setAttribute(_toDOMS("iRefLayer"), _toDOMS(stringStr.str()));
0603
0604 stringStr.str("");
0605 stringStr << 0;
0606 aRefHitElement->setAttribute(_toDOMS("iRegion"), _toDOMS(stringStr.str()));
0607
0608 stringStr.str("");
0609 stringStr << 0;
0610 aRefHitElement->setAttribute(_toDOMS("iInput"), _toDOMS(stringStr.str()));
0611
0612 int iPhiMin = 0;
0613 int iPhiMax = 1;
0614
0615 stringStr.str("");
0616 stringStr << iPhiMin;
0617 aRefHitElement->setAttribute(_toDOMS("iPhiMin"), _toDOMS(stringStr.str()));
0618
0619 stringStr.str("");
0620 stringStr << iPhiMax;
0621 aRefHitElement->setAttribute(_toDOMS("iPhiMax"), _toDOMS(stringStr.str()));
0622
0623 aProcessorElement->appendChild(aRefHitElement);
0624 }
0625 }
0626 }
0627
0628 for (unsigned int iRegion = 0; iRegion < 6; ++iRegion) {
0629 xercesc::DOMElement* aRegionElement = theDoc->createElement(_toDOMS("LogicRegion"));
0630 stringStr.str("");
0631 stringStr << iRegion;
0632 aRegionElement->setAttribute(_toDOMS("iRegion"), _toDOMS(stringStr.str()));
0633
0634 for (unsigned int iLogicLayer = 0; iLogicLayer < myOMTFConfig->nLayers(); ++iLogicLayer) {
0635 xercesc::DOMElement* aLayerElement = theDoc->createElement(_toDOMS("Layer"));
0636 stringStr.str("");
0637 stringStr << iLogicLayer;
0638
0639 aLayerElement->setAttribute(_toDOMS("iLayer"), _toDOMS(stringStr.str()));
0640 const OMTFConfiguration::vector1D& myCounts =
0641 myOMTFConfig->getMeasurements4D()[iProcessor][iRegion][iLogicLayer];
0642 unsigned int maxInput = findMaxInput(myCounts);
0643 unsigned int begin = 0, end = 0;
0644 if ((int)maxInput - 2 >= 0)
0645 begin = maxInput - 2;
0646 else
0647 begin = maxInput;
0648 end = maxInput + 3;
0649 stringStr.str("");
0650 stringStr << begin;
0651 aLayerElement->setAttribute(_toDOMS("iFirstInput"), _toDOMS(stringStr.str()));
0652 stringStr.str("");
0653 stringStr << end - begin + 1;
0654 aLayerElement->setAttribute(_toDOMS("nInputs"), _toDOMS(stringStr.str()));
0655 aRegionElement->appendChild(aLayerElement);
0656 }
0657 aProcessorElement->appendChild(aRegionElement);
0658 }
0659 theTopElement->appendChild(aProcessorElement);
0660 }
0661 }
0662
0663
0664 unsigned int XMLConfigWriter::findMaxInput(const OMTFConfiguration::vector1D& myCounts) {
0665 unsigned int max = 0;
0666 unsigned int maxInput = 0;
0667 for (unsigned int iInput = 0; iInput < 14; ++iInput) {
0668 if (myCounts[iInput] > (int)max) {
0669 max = myCounts[iInput];
0670 maxInput = iInput;
0671 }
0672 }
0673 return maxInput;
0674 }
0675
0676