10 #include <xercesc/util/PlatformUtils.hpp>
11 #include <xercesc/dom/DOMNamedNodeMap.hpp>
38 #define X(str) XString(str).unicode_str()
39 #define S(str) str.c_str()
41 using namespace xercesc;
50 <<
" hddm-root [-x] [-n <count>] [-o <filename>] [HDDM file]\n\n"
52 <<
" -o <filename> write to output root file <filename>\n"
53 <<
" -n <count> limit output to <count> rows\n"
54 <<
" -x write xml to stdout"
55 <<
" (in addition to root file output)\n"
69 virtual void reset() = 0;
100 virtual void set(
int val) {
107 std::stringstream
str;
134 virtual void set(
int val) {
141 std::stringstream
str;
176 std::stringstream
str;
205 virtual void set(
long int val) {
212 std::stringstream
str;
243 virtual void set(
float val) {
250 std::stringstream
str;
277 virtual void set(
double val) {
284 std::stringstream
str;
304 strncpy(value, src.
value, 80);
309 strncpy(value,
"", 80);
311 virtual void set(
char *val) {
312 strncpy(value, val, 80);
323 strncpy(value, val.c_str(), 80);
324 return (val.size() + 7) / 4 * 4;
338 strncpy(value, src.
value, 80);
343 strncpy(value,
"", 80);
345 virtual void set(
char *val) {
346 strncpy(value, val, 80);
357 strncpy(value, val.c_str(), 80);
358 return (val.size() + 7) / 4 * 4;
376 strncpy(value,
"", 4);
383 int size = (strlen(str) + 7) / 4 * 4;
384 value =
new char[
size];
385 strncpy(value, str, size);
410 : fKey(0), fTree(tree), fRepeats(0) {}
412 : fKey(0), fTree(tree), fName(name), fRepeats(0) {}
416 fAttributes.push_back(attr);
419 fElements.push_back(elem);
443 static int indent = 0;
446 std::cout <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
448 <<
"<HDDM class=\"s\" version=\"1.0\" "
449 <<
"xmlns=\"http://www.gluex.org/hddm\">"
454 while (seen < size) {
456 for (
int i=0; i < indent; ++i)
458 std::cout <<
"<" << fName;
460 std::list<attribute_t*>::iterator ater;
461 for (ater = fAttributes.begin(); ater != fAttributes.end(); ++ater) {
462 seen += (*ater)->read(ifx);
464 std::cout <<
" " << (*ater)->get_name() <<
"=\""
465 << (*ater)->toString() <<
"\"";
468 if (fElements.size() == 0) {
470 std::cout <<
" />" << std::endl;
479 std::cout <<
">" << std::endl;
482 std::list<element_t*>::iterator eter;
483 for (eter = fElements.begin(); eter != fElements.end(); ++eter) {
484 seen += (*eter)->read(ifx);
488 for (
int i=0; i < indent; ++i) {
491 std::cout <<
"</" << fName <<
">" << std::endl;
498 assert (seen == size);
523 fRootFile =
new TFile(
S(filename),
"recreate");
529 void build(
const DOMElement* elem,
element_t *parent_element,
532 int savetrees(
element_t *parent_element);
550 setg(buffer, buffer, buffer + bufferLength);
554 return gptr() - eback();
563 return egptr() - gptr();
567 char *gbegin = eback();
568 char *gend = egptr();
569 setg(gbegin, gbegin, gend);
577 int main(
int argC,
char* argV[])
583 XMLPlatformUtils::Initialize();
585 catch (
const XMLException* toCatch)
587 XString msg(toCatch->getMessage());
589 <<
"hddm-root: Error during initialization! :\n"
590 <<
S(msg) << std::endl;
596 for (argInd = 1; argInd < argC; argInd++)
598 if (argV[argInd][0] !=
'-')
602 else if (strcmp(argV[argInd],
"-x") == 0)
606 else if (strcmp(argV[argInd],
"-o") == 0)
608 rootFilename = argV[++argInd];
610 else if (strcmp(argV[argInd],
"-n") == 0)
612 if (!sscanf(argV[++argInd],
"%d",&reqcount))
631 else if (argInd == argC - 1)
633 hddmFile =
XString(argV[argInd]);
634 ifs =
new std::ifstream(hddmFile.c_str());
644 <<
"hddm-root: Error opening input stream " << hddmFile << std::endl;
647 std::ostringstream doc;
648 std::ostringstream tmpFileStr;
649 tmpFileStr <<
"tmp" << getpid();
650 std::ofstream ofs(tmpFileStr.str().c_str());
654 <<
"hddm-root: Error opening temp file " << tmpFileStr.str() << std::endl;
658 ofs <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
662 if (getline(*ifs,line))
664 if (line.substr(0,5) ==
"<?xml")
667 <<
"hddm-root: Error reading input stream " << hddmFile
670 <<
"Input file appears to be an xml document!" << std::endl;
673 else if (line.substr(0,5) ==
"<HDDM")
675 xmlHeader = line +
"\n";
676 ofs << line << std::endl;
677 doc << line << std::endl;
682 <<
"hddm-root: Input stream does not contain valid hddm header"
690 <<
"hddm-root: Error reading from input stream " << hddmFile
694 while (getline(*ifs,line))
696 ofs << line << std::endl;
697 doc << line << std::endl;
698 if (line ==
"</HDDM>")
705 #if defined OLD_STYLE_XERCES_PARSER
713 <<
"hddm-root : Error parsing HDDM document, "
714 <<
"cannot continue" << std::endl;
717 unlink(tmpFileStr.str().c_str());
719 DOMElement* rootEl = document->getDocumentElement();
720 XString rootS(rootEl->getTagName());
724 <<
"hddm-root error: root element of input document is "
725 <<
"\"" <<
S(rootS) <<
"\", expected \"HDDM\""
734 builder.
build(rootEl, &root_element, columns);
736 int event_buffer_size;
737 char *event_buffer =
new char[event_buffer_size = 1000000];
740 int integrity_check_mode = 0;
741 int compression_mode = 0;
742 while (reqcount && ifs->good())
745 ifs->read(event_buffer,4);
751 #ifdef VERBOSE_HDDM_LOGGING
752 XString tnameS(rootEl->getTagName());
753 std::cerr <<
"hddm-root : tag " <<
S(tnameS)
754 <<
" found with size " << tsize
761 else if (tsize == 1) {
762 int size, format, flags;
763 ifs->read(event_buffer+4,4);
765 ifs->read(event_buffer+8,size);
766 *ifx >> format >> flags;
767 int compression_flags = flags & 0xf0;
768 int integrity_flags = flags & 0x0f;
769 std::streambuf *fin_sb = 0;
770 xstream::z::istreambuf *zin_sb = 0;
771 xstream::bz::istreambuf *bzin_sb = 0;
772 int *leftovers =
new int[100];
773 int sizeof_leftovers =
sizeof(
int[100]);
775 if (compression_flags == compression_mode) {
776 fin_sb = ifs->rdbuf();
778 else if (size == 8 && format == 0 && compression_flags == 0x10) {
779 if (compression_mode == 0x20) {
780 bzin_sb = (xstream::bz::istreambuf*)ifs->rdbuf();
782 compression_mode = compression_flags;
783 zin_sb =
new xstream::z::istreambuf(ifs->rdbuf(),
784 leftovers, sizeof_leftovers);
789 else if (size == 8 && format == 0 && compression_flags == 0x20) {
790 if (compression_mode == 0x10) {
791 zin_sb = (xstream::z::istreambuf*)ifs->rdbuf();
793 compression_mode = compression_flags;
794 bzin_sb =
new xstream::bz::istreambuf(ifs->rdbuf(),
795 leftovers, sizeof_leftovers);
801 if (compression_mode == 0x20) {
802 bzin_sb = (xstream::bz::istreambuf*)ifs->rdbuf();
803 fin_sb = bzin_sb->get_streambuf();
805 else if (compression_mode == 0x10) {
806 zin_sb = (xstream::z::istreambuf*)ifs->rdbuf();
807 fin_sb = zin_sb->get_streambuf();
809 compression_mode = compression_flags;
816 if (size == 8 && format == 0 && integrity_flags == 0x0) {
817 integrity_check_mode = 0;
819 else if (size == 8 && format == 0 && integrity_flags == 0x1) {
820 integrity_check_mode = 1;
823 std::cerr <<
"hddm-root error: unrecognized stream modifier"
824 " encountered, this stream is no longer readable."
830 else if (tsize+4 > event_buffer_size) {
833 char *new_buffer =
new char[event_buffer_size = tsize+1000];
836 memcpy(new_buffer,event_buffer,4);
838 delete[] event_buffer;
839 event_buffer = new_buffer;
841 ifs->read(event_buffer+4,tsize);
844 if (integrity_check_mode == 1) {
848 unsigned int recorded_crc;
850 xstr >> recorded_crc;
851 xstream::digest::crc32 crc;
852 std::ostream out(&crc);
853 out.write(event_buffer,tsize+4);
855 if (crc.digest() != recorded_crc) {
856 #if BAD_CRC_IS_ONLY_WARNING
857 static int bad_crc_warning_needed =
true;
859 "WARNING: data integrity crc check failed on input.\n"
860 "This may be the result of a bug in the xstream library\n"
861 "if you are analyzing a data file that was generated by\n"
862 "code prior to svn rev 18530. If this concerns you, \n"
863 "regenerate the file using a newer build of the sim-recon\n"
864 "tools and it should go away.\n";
865 if (bad_crc_warning_needed) {
866 std::cerr << errmsg << std::endl;
867 bad_crc_warning_needed =
false;
870 std::cerr <<
"hddm-root error: crc32 check error on input stream"
871 " encountered, this stream is no longer readable."
880 std::cout <<
"</HDDM>" << std::endl;
883 TNamed docString(
"document_metadata_XML", doc.str().c_str());
886 if (ifs != &std::cin)
888 ((std::ifstream*)ifs)->close();
891 XMLPlatformUtils::Terminate();
901 XString elemS(elem->getTagName());
902 std::list<element_t*>::iterator eter;
903 for (eter = fElements.begin(); eter != fElements.end(); ++eter) {
904 if (elemS == (*eter)->fName) {
905 elemS = parent_element->
fName +
"_" + elemS;
908 TTree *tree =
new TTree(
S(elemS),
S(
XString(elemS +
" tree")));
910 fElements.push_back(this_element);
912 XString repS(elem->getAttribute(
X(
"maxOccurs")));
913 int rep = (repS ==
"unbounded")? INT_MAX :
923 XString keyS(
"HDDM_MASTER_ORDERING_KEY");
924 if (fColumns.find(keyS) == fColumns.end()) {
926 fColumns[keyS] = key;
928 tree->Branch(
"key", fColumns[keyS]->
address(),
"key/I");
933 attribute_list::iterator iter;
934 for (iter = columns.begin(); iter != columns.end(); ++iter) {
937 XString typeS = fColumns[colS]->get_type();
938 if (typeS ==
"int" || typeS ==
"boolean" || typeS ==
"Particle_t")
939 tree->Branch(
S(nameS), fColumns[colS]->
address(),
941 else if (typeS ==
"long")
942 tree->Branch(
S(nameS), fColumns[colS]->
address(),
944 else if (typeS ==
"float")
945 tree->Branch(
S(nameS), fColumns[colS]->
address(),
947 else if (typeS ==
"double")
948 tree->Branch(
S(nameS), fColumns[colS]->
address(),
950 else if (typeS ==
"string" || typeS ==
"anyURI")
951 tree->Branch(
S(nameS), fColumns[colS]->
address(),
954 tree->Branch(
S(nameS), fColumns[colS]->
address(),
961 DOMNamedNodeMap* attrList = elem->getAttributes();
962 int attrListLength = attrList->getLength();
963 for (
int a = 0; a < attrListLength; a++) {
964 DOMNode* node = attrList->item(a);
965 XString nameS(node->getNodeName());
966 XString typeS(node->getNodeValue());
967 XString colS(elemS +
"_" + nameS);
968 if (columns.find(nameS) != columns.end())
970 if (typeS ==
"int") {
972 tree->Branch(
S(nameS), fColumns[colS]->
address(),
975 else if (typeS ==
"boolean") {
977 tree->Branch(
S(nameS), fColumns[colS]->
address(),
980 else if (typeS ==
"Particle_t") {
982 tree->Branch(
S(nameS), fColumns[colS]->
address(),
985 else if (typeS ==
"long") {
987 tree->Branch(
S(nameS), fColumns[colS]->
address(),
990 else if (typeS ==
"float") {
992 tree->Branch(
S(nameS), fColumns[colS]->
address(),
995 else if (typeS ==
"double") {
997 tree->Branch(
S(nameS), fColumns[colS]->
address(),
1000 else if (typeS ==
"string") {
1002 tree->Branch(
S(nameS), fColumns[colS]->
address(),
1005 else if (typeS ==
"anyURI") {
1007 tree->Branch(
S(nameS), fColumns[colS]->
address(),
1010 else if (nameS ==
"minOccurs" || nameS ==
"maxOccurs") {
1015 tree->Branch(
S(nameS), fColumns[colS]->
address(),
1019 columns[colS] = nameS;
1027 DOMNodeList* contList = elem->getChildNodes();
1028 int contLength = contList->getLength();
1029 for (
int c = 0;
c < contLength;
c++) {
1030 DOMNode* cont = contList->item(
c);
1031 short type = cont->getNodeType();
1032 if (type == DOMNode::ELEMENT_NODE) {
1033 DOMElement* contEl = (DOMElement*) cont;
1034 build(contEl, this_element, columns);
1042 std::list<element_t*>::iterator iter;
1044 for (iter = HDDMelement->
fElements.begin();
1048 size += (*iter)->read(ifx);
1049 #ifdef VERBOSE_HDDM_LOGGING
1050 XString cnameS((*iter)->fName);
1051 std::cerr <<
"hddm-root : top-level tag " <<
S(cnameS)
1052 <<
" found with size " << size
1062 std::list<element_t*>::iterator iter;
1063 for (iter = parent_element->
fElements.begin();
1064 iter != parent_element->
fElements.end();
1067 if ((*iter)->fTree) {
1068 (*iter)->fTree->Write();
1071 count += savetrees(*iter);
virtual std::string toString()
int filltrees(ixstream *ifx, element_t *parent_element)
virtual void set(int val)
C++ iostream like interface to read and write xdr streams.
void add_element(element_t *elem)
virtual int read(ixstream *ifx)
virtual std::string toString()
constant_attribute_t(XString name)
virtual int read(ixstream *ifx)
float_attribute_t & operator=(const float_attribute_t &src)
std::list< element_t * > fElements
double_attribute_t & operator=(const double_attribute_t &src)
virtual void set(float val)
xercesc::DOMDocument * buildDOMDocument(const XString &xmlFile, bool keep)
C++ objects to calculate digests of data.
virtual std::string toString()
boolean_attribute_t & operator=(const boolean_attribute_t &src)
virtual void set(char *val)
TreeMaker(XString filename)
static char * ParticleType(Particle_t p)
void add_attribute(attribute_t *attr)
anyURI_attribute_t & operator=(const anyURI_attribute_t &src)
TreeMaker(const TreeMaker &src)
TreeMaker operator=(const TreeMaker &src)
xercesc::DOMDocument * parseInputDocument(const XString &xmlFile, bool keep)
virtual std::string toString()
virtual XString get_type()
constant_attribute_t & operator=(const constant_attribute_t &src)
anyURI_attribute_t(XString name)
double_attribute_t(XString name)
virtual XString get_name()
void build(const DOMElement *elem, element_t *parent_element, attribute_list columns)
virtual void set(double val)
std::map< XString, attribute_t * > attribute_table
virtual std::string toString()
std::list< element_t * > fElements
virtual int read(ixstream *ifx)
virtual int read(ixstream *ifx)
attribute_t(XString name, XString type)
virtual int read(ixstream *ifx)
boolean_attribute_t(XString name)
virtual std::string toString()
std::list< attribute_t * > fAttributes
long_attribute_t(XString name)
virtual int read(ixstream *ifx)
C++ streambuf interface to read and write file formats supported by Zlib.
virtual void set(int val)
int_attribute_t(XString name)
std::map< XString, XString > attribute_list
long_attribute_t & operator=(const long_attribute_t &src)
string_attribute_t & operator=(const string_attribute_t &src)
virtual ~long_attribute_t()
virtual void set(Particle_t val)
virtual ~Particle_attribute_t()
istreambuffer(char *buffer, std::streamsize bufferLength)
string_attribute_t(XString name)
virtual void set(char *val)
C++ streambuf interface to read and write bzip2 streams.
float_attribute_t(XString name)
virtual int read(ixstream *ifx)
virtual void set(long int val)
virtual ~float_attribute_t()
virtual int read(ixstream *ifx)
int_attribute_t & operator=(const int_attribute_t &src)
int savetrees(element_t *parent_element)
attribute_t(XString name)
xstream::xdr::istream ixstream
virtual std::string toString()
virtual ~boolean_attribute_t()
void set(const char *str)
Particle_attribute_t(XString name)
virtual ~int_attribute_t()
int write_xml_output_to_stdout
Particle_attribute_t & operator=(const Particle_attribute_t &src)
void seekg(std::streampos pos)
virtual int read(ixstream *ifx)
int explicit_repeat_count
virtual std::string toString()
int main(int argc, char *argv[])
virtual std::string toString()
void add_key(int_attribute_t *attr)
element_t(TTree *tree, XString name)