1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#include "CondTools/Ecal/interface/EcalAlignmentXMLTranslator.h"
#include "CondTools/Ecal/interface/DOMHelperFunctions.h"
#include "CondFormats/Alignment/interface/Alignments.h"
#include "Utilities/Xerces/interface/Xerces.h"
#include "Utilities/Xerces/interface/XercesStrUtils.h"
#include <xercesc/dom/DOMNode.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/sax/SAXException.hpp>
#include <xercesc/framework/LocalFileFormatTarget.hpp>
#include <iostream>
#include <sstream>
#include <fstream>
using namespace XERCES_CPP_NAMESPACE;
using namespace xuti;
using namespace std;
int EcalAlignmentXMLTranslator::writeXML(const string& filename,
const EcalCondHeader& header,
const Alignments& record) {
cms::concurrency::xercesInitialize();
fstream fs(filename.c_str(), ios::out);
fs << dumpXML(header, record);
cms::concurrency::xercesTerminate();
return 0;
}
string EcalAlignmentXMLTranslator::dumpXML(const EcalCondHeader& header, const Alignments& record) {
unique_ptr<DOMImplementation> impl(DOMImplementationRegistry::getDOMImplementation(cms::xerces::uStr("LS").ptr()));
DOMLSSerializer* writer = impl->createLSSerializer();
if (writer->getDomConfig()->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true))
writer->getDomConfig()->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true);
DOMDocumentType* doctype = impl->createDocumentType(cms::xerces::uStr("XML").ptr(), nullptr, nullptr);
DOMDocument* doc = impl->createDocument(nullptr, cms::xerces::uStr(AlignmentConstant_tag.c_str()).ptr(), doctype);
DOMElement* root = doc->getDocumentElement();
xuti::writeHeader(root, header);
for (vector<AlignTransform>::const_iterator it = record.m_align.begin(); it != record.m_align.end(); it++) {
int Id = (*it).rawId();
int sub = (Id >> 24) & 0xF;
stringstream subdet;
if (sub == 2) {
subdet << "EB";
int SM;
int phi = Id & 0x1FF;
// int eta = (Id>>9)&0x3F;
int side = (Id >> 16) & 1;
if (side == 0) {
subdet << "-";
SM = (phi + 19) / 20;
} else {
subdet << "+";
SM = phi / 20;
}
if (SM < 10)
subdet << "0" << SM;
else
subdet << SM;
} else if (sub == 4) {
subdet << "EE";
// int y = Id&0x7F;
int x = (Id >> 7) & 0x7F;
// int Dee = x/70 + 1;
int side = (Id >> 14) & 1;
if (side == 0) {
subdet << "-";
} else {
subdet << "+";
}
// subdet << "0" << Dee;
if (x == 20)
subdet << "F";
else if (x == 70)
subdet << "N";
else
cout << " strange value for x " << x << endl; // should never occur
} else if (sub == 6) {
subdet << "ES";
// int strip = Id&0x3F;
int x = (Id >> 6) & 0x3F;
// int y = (Id>>12)&0x3F;
int plane = (Id >> 18) & 1;
int side = (Id >> 19) & 1;
if (side == 0)
subdet << "-";
else
subdet << "+";
if (plane)
subdet << "F";
else
subdet << "R";
if (x / 30)
subdet << "F";
else
subdet << "N";
} else
cout << " problem sub = " << sub << endl;
cout << (*it).rawId() << " " << (*it).rotation().getPhi() << " " << (*it).rotation().getTheta() << " "
<< (*it).rotation().getPsi() << " " << (*it).translation().x() << " " << (*it).translation().y() << " "
<< (*it).translation().z() << endl;
uint32_t rawid = (*it).rawId();
DOMElement* cellnode = root->getOwnerDocument()->createElement(cms::xerces::uStr(Cell_tag.c_str()).ptr());
root->appendChild(cellnode);
cellnode->setAttribute(cms::xerces::uStr(subdet_tag.c_str()).ptr(), cms::xerces::uStr(subdet.str().c_str()).ptr());
xuti::WriteNodeWithValue(cellnode, id_tag, rawid);
xuti::WriteNodeWithValue(cellnode, x_tag, (*it).translation().x());
xuti::WriteNodeWithValue(cellnode, y_tag, (*it).translation().y());
xuti::WriteNodeWithValue(cellnode, z_tag, (*it).translation().z());
xuti::WriteNodeWithValue(cellnode, Phi_tag, (*it).rotation().getPhi());
xuti::WriteNodeWithValue(cellnode, Theta_tag, (*it).rotation().getTheta());
xuti::WriteNodeWithValue(cellnode, Psi_tag, (*it).rotation().getPsi());
}
std::string dump = cms::xerces::toString(writer->writeToString(root));
doc->release();
doctype->release();
writer->release();
return dump;
}
|