#include #include #include #include #include #include #include "TRandom3.h" #include "JDetector/JTripod.hh" #include "JSupport/JMeta.hh" #include "JLang/JComparator.hh" #include "JLang/JComparison.hh" #include "Jeep/JContainer.hh" #include "Jeep/JPrint.hh" #include "Jeep/JParser.hh" #include "Jeep/JMessage.hh" namespace { using namespace JPP; /** * Wild card for tripod identifier. */ static const int WILDCARD = -1; static const std::string set_t = "set"; //!< Set UTM position static const std::string add_t = "add"; //!< Add UTM position static const std::string sub_t = "sub"; //!< Subtract UTM position static const std::string setx_t = "setx"; //!< Set East" static const std::string sety_t = "sety"; //!< Set North" static const std::string setz_t = "setz"; //!< Set depth static const std::string addx_t = "addx"; //!< Add East" static const std::string addy_t = "addy"; //!< Add North" static const std::string addz_t = "addz"; //!< Add depth static const std::string subx_t = "subx"; //!< Subtract East" static const std::string suby_t = "suby"; //!< Subtract North" static const std::string subz_t = "subz"; //!< Subtract depth static const std::string rand_t = "rand"; //!< Random value(s) static const std::string randset_t = rand_t + set_t; //!< Set UTM position static const std::string randadd_t = rand_t + add_t; //!< Add UTM position static const std::string randsub_t = rand_t + sub_t; //!< Subtract UTM position /** * Auxiliary class to apply tripod modifications. */ struct JModifier { /** * Default constructor. */ JModifier() {} /** * Check validity. * * \return true if valid modifier; else false */ bool is_valid() const { return (action != "" && !data.empty()); } /** * Apply modification to given tripod. * * \param tripod tripod * \return true if valid action; else false */ bool apply(JTripod& tripod) const { switch (data.size()) { case 1: return apply(tripod, action, data[0]); case 3: return apply(tripod, action, JUTMPosition(data[0], data[1], data[2])); default: return false; } } /** * Apply modification to given tripod. * * \param tripod tripod * \param action action * \param value value * \return true if valid action; else false */ static bool apply(JTripod& tripod, const std::string& action, const double value) { if (action == setx_t) tripod.setUTMPosition(JUTMPosition(value, tripod.getUTMNorth(), tripod.getUTMZ())); else if (action == addx_t) tripod.add(JUTMPosition(value, 0.0, 0.0)); else if (action == subx_t) tripod.sub(JUTMPosition(value, 0.0, 0.0)); else if (action == sety_t) tripod.setUTMPosition(JUTMPosition(tripod.getUTMEast(), value, tripod.getUTMZ())); else if (action == addy_t) tripod.add(JUTMPosition(0.0, value, 0.0)); else if (action == suby_t) tripod.sub(JUTMPosition(0.0, value, 0.0)); else if (action == setz_t) tripod.setUTMPosition(JUTMPosition(tripod.getUTMEast(), tripod.getUTMNorth(), value)); else if (action == addz_t) tripod.add(JUTMPosition(0.0, 0.0, value)); else if (action == subz_t) tripod.sub(JUTMPosition(0.0, 0.0, value)); else return false; return true; } /** * Apply modification to given tripod. * * \param tripod tripod * \param action action * \param pos position * \return true if valid action; else false */ static bool apply(JTripod& tripod, const std::string& action, const JUTMPosition& pos) { const JUTMPosition randpos(gRandom->Gaus(0.0, pos.getUTMEast()), gRandom->Gaus(0.0, pos.getUTMNorth()), gRandom->Gaus(0.0, pos.getUTMZ())); if (action == set_t) // actions with fixed values tripod.setUTMPosition(pos); else if (action == add_t) tripod.add(pos); else if (action == sub_t) tripod.sub(pos); else if (action == randset_t) // actions with random values tripod.setUTMPosition(randpos); else if (action == randadd_t) tripod.add(randpos); else if (action == randsub_t) tripod.sub(randpos); else return false; return true; } /** * Read modifier from input. * * \param in input stream * \param modifier modifier * \return input stream */ friend inline std::istream& operator>>(std::istream& in, JModifier& modifier) { if (in >> modifier.id >> modifier.action) { modifier.data.clear(); for (double x; in >> x; ) { modifier.data.push_back(x); } in.clear(std::ios_base::eofbit); } return in; } /** * Write modifier to output. * * \param out output stream * \param modifier modifier * \return output stream */ friend inline std::ostream& operator<<(std::ostream& out, const JModifier& modifier) { out << modifier.id; out << ' '; out << modifier.action; for (std::vector::const_iterator i = modifier.data.begin(); i != modifier.data.end(); ++i) { out << ' ' << *i; } return out; } int id; std::string action; std::vector data; }; } /** * \file * * Auxiliary program to modify tripod configuration. * * Syntax: *
 *     -T "     (set|add|sub)    East North depth"
 *     -T "     (setx|addx|subx) East"
 *     -T "     (sety|addy|suby) North"
 *     -T "     (setz|addz|subz) depth"
 * 
* * The options *
 *     -A " East North depth"
 *     -r ""
 *     -k ""
 * 
* can be used to add, remove and keep a specific tripod, respectively. * * \author mdejong */ int main(int argc, char **argv) { using namespace std; using namespace JPP; typedef JContainer< vector > container_type; string inputFile; string outputFile; vector mod; vector add; set rm; set keep; bool squash; int debug; try { JParser<> zap("Auxiliary program to modify tripod configuration."); zap['f'] = make_field(inputFile, "tripod input file"); zap['o'] = make_field(outputFile, "tripod output file"); zap['T'] = make_field(mod, "tripod modifier") = JPARSER::initialised(); zap['A'] = make_field(add, "add tripod") = JPARSER::initialised(); zap['r'] = make_field(rm, "remove tripod[s]") = JPARSER::initialised(); zap['k'] = make_field(keep, "keep tripod[s]") = JPARSER::initialised(); zap['q'] = make_field(squash, "squash meta data"); zap['d'] = make_field(debug, "debug level") = 2; zap(argc, argv); } catch(const exception &error) { FATAL(error.what() << endl); } gRandom->SetSeed(0); if (!rm.empty() && !keep.empty()) { FATAL("Use either option -K or -D." << endl); } container_type data; if (inputFile != "") { try { data.load(inputFile.c_str()); } catch(const exception& error) { //FATAL(error.what() << endl); } } if (squash) { data.comment.clear(); } data.comment.add(JMeta(argc, argv)); for (vector::const_iterator i = add.begin(); i != add.end(); ++i) { data.push_back(*i); } for (vector::const_iterator i = mod.begin(); i != mod.end(); ++i) { for (container_type::iterator target = data.begin(); target != data.end(); ++target) { if (target->getID() == i->id || i->id == WILDCARD) { DEBUG("Modifier" << ' ' << "(" << FILL(2,'0') << target->getID() << FILL() << ")" << ' ' << i->action << ' ' << JEEPZ() << i->data << endl); if (!i->apply(*target)) { ERROR("No valid action: " << *i << endl); } } } } if (!rm.empty()) { for (container_type::iterator target = data.begin(); target != data.end(); ) { if (rm.count(target->getID()) != 0) target = data.erase(target); else ++target; } } if (!keep.empty()) { for (container_type::iterator target = data.begin(); target != data.end(); ) { if (keep.count(target->getID()) == 0) target = data.erase(target); else ++target; } } sort(data.begin(), data.end(), make_comparator(&JTripod::getID)); data.store(outputFile.c_str()); }