File indexing completed on 2024-04-06 11:56:21
0001
0002
0003
0004 #include "Alignment/Geners/interface/IOException.hh"
0005 #include <fstream>
0006 #include <iostream>
0007 #include <map>
0008
0009 #include <memory>
0010 #include "Alignment/Geners/interface/CStringStream.hh"
0011 #include "Alignment/Geners/interface/CatalogIO.hh"
0012 #include "Alignment/Geners/interface/ContiguousCatalog.hh"
0013
0014 #include "CmdLine.hh"
0015
0016 using namespace gs;
0017 using namespace std;
0018
0019 static void print_usage(const char *progname) {
0020 cout << "\nUsage: " << progname << " [-a] [-c] [-f] [-i] [-s] filename\n\n"
0021 << "This program prints the contents of \"geners\" catalog files to the "
0022 "standard\n"
0023 << "output. These files can be usually recognized by their \".gsbmf\" "
0024 "extension\n"
0025 << "(Generic Serialization Binary MetaFile). Normally, the program "
0026 "prints class\n"
0027 << "names, item names in the archive, and archive categories for all "
0028 "items in\n"
0029 << "the catalog. This default behavior can be modified with option "
0030 "switches.\n"
0031 << "The meaning of the switches is as follows:\n\n"
0032 << " -a Print catalog annotations, if any.\n\n"
0033 << " -c Print default archive compression mode.\n\n"
0034 << " -f Full dump. Print complete info for each catalog entry.\n\n"
0035 << " -i Include the catalog item ids into the printout.\n\n"
0036 << " -s Print only the summary statistics for item types. If option "
0037 "\"-f\" is given\n"
0038 << " together with \"-s\", the summary will be printed after the "
0039 "full dump.\n"
0040 << endl;
0041 }
0042
0043 int main(int argc, char const *argv[]) {
0044 CmdLine cmdline(argc, argv);
0045
0046 if (argc == 1) {
0047 print_usage(cmdline.progname());
0048 return 0;
0049 }
0050
0051 std::string inputfile;
0052 bool printAnnotations = false;
0053 bool printCompressionMode = false;
0054 bool fullDump = false;
0055 bool printIds = false;
0056 bool summaryMode = false;
0057
0058 try {
0059 printAnnotations = cmdline.has("-a");
0060 printCompressionMode = cmdline.has("-c");
0061 fullDump = cmdline.has("-f");
0062 printIds = cmdline.has("-i");
0063 summaryMode = cmdline.has("-s");
0064
0065 cmdline.optend();
0066
0067 if (cmdline.argc() != 1)
0068 throw CmdLineError("wrong number of command line arguments");
0069 cmdline >> inputfile;
0070 } catch (CmdLineError &e) {
0071 cerr << "Error in " << cmdline.progname() << ": " << e.str() << endl;
0072 print_usage(cmdline.progname());
0073 return 1;
0074 }
0075
0076 ifstream in(inputfile.c_str(), ios_base::binary);
0077 if (!in.is_open()) {
0078 cerr << "Error: failed to open file \"" << inputfile << "\"" << endl;
0079 return 1;
0080 }
0081
0082 unsigned compressionCode = 0, mergeLevel = 0;
0083 std::vector<std::string> annotations;
0084 std::unique_ptr<ContiguousCatalog> cat;
0085 try {
0086 cat = std::unique_ptr<ContiguousCatalog>(
0087 readBinaryCatalog<ContiguousCatalog>(in, &compressionCode, &mergeLevel, &annotations, true));
0088 } catch (std::exception &e) {
0089 cerr << "Failed to read catalog from file \"" << inputfile << "\". " << e.what() << endl;
0090 return 1;
0091 }
0092
0093 if (printCompressionMode) {
0094 CStringStream::CompressionMode mode = static_cast<CStringStream::CompressionMode>(compressionCode);
0095 cout << "Default compression mode: " << CStringStream::compressionModeName(mode, false) << endl;
0096 }
0097 if (printAnnotations) {
0098 const unsigned nAnnotations = annotations.size();
0099 for (unsigned i = 0; i < nAnnotations; ++i) {
0100 if (i)
0101 cout << '\n';
0102 cout << "Annotation " << i << ": " << annotations[i] << endl;
0103 }
0104 if (!nAnnotations)
0105 cout << "This catalog does not have any annotations" << endl;
0106 }
0107
0108 std::map<std::string, unsigned> typecount;
0109
0110 const unsigned long long first = cat->smallestId();
0111 const unsigned long long last = cat->largestId();
0112 for (unsigned long long id = first; id <= last; ++id) {
0113 if (!cat->itemExists(id))
0114 continue;
0115
0116 std::shared_ptr<const CatalogEntry> e = cat->retrieveEntry(id);
0117 if (fullDump) {
0118 if (id != first)
0119 cout << '\n';
0120 e->humanReadable(cout);
0121 } else if (!summaryMode) {
0122 if (printIds)
0123 cout << e->id() << " ";
0124 cout << e->type().name() << " " << '"' << e->name() << '"' << " " << '"' << e->category() << '"' << endl;
0125 }
0126 if (summaryMode)
0127 typecount[e->type().name()]++;
0128 }
0129
0130 if (summaryMode) {
0131 if (fullDump)
0132 cout << '\n';
0133 for (std::map<std::string, unsigned>::const_iterator it = typecount.begin(); it != typecount.end(); ++it)
0134 cout << it->second << ' ' << it->first << endl;
0135 }
0136
0137 return 0;
0138 }