10#include "JDetector/JTripod.hh"
11#include "JSupport/JMeta.hh"
12#include "JLang/JComparator.hh"
13#include "JLang/JComparison.hh"
14#include "Jeep/JContainer.hh"
15#include "Jeep/JPrint.hh"
16#include "Jeep/JParser.hh"
17#include "Jeep/JMessage.hh"
27 static const int WILDCARD = -1;
29 static const std::string set_t =
"set";
30 static const std::string add_t =
"add";
31 static const std::string sub_t =
"sub";
32 static const std::string setx_t =
"setx";
33 static const std::string sety_t =
"sety";
34 static const std::string setz_t =
"setz";
35 static const std::string addx_t =
"addx";
36 static const std::string addy_t =
"addy";
37 static const std::string addz_t =
"addz";
38 static const std::string subx_t =
"subx";
39 static const std::string suby_t =
"suby";
40 static const std::string subz_t =
"subz";
42 static const std::string rand_t =
"rand";
43 static const std::string randset_t = rand_t + set_t;
44 static const std::string randadd_t = rand_t + add_t;
45 static const std::string randsub_t = rand_t + sub_t;
65 return (action !=
"" && !data.empty());
74 bool apply(JTripod& tripod)
const
76 switch (data.size()) {
79 return apply(tripod, action, data[0]);
82 return apply(tripod, action, JUTMPosition(data[0], data[1], data[2]));
98 static bool apply(JTripod& tripod,
const std::string& action,
const double value)
100 if (action == setx_t)
101 tripod.setUTMPosition(JUTMPosition(value, tripod.getUTMNorth(), tripod.getUTMZ()));
102 else if (action == addx_t)
103 tripod.add(JUTMPosition(value, 0.0, 0.0));
104 else if (action == subx_t)
105 tripod.sub(JUTMPosition(value, 0.0, 0.0));
106 else if (action == sety_t)
107 tripod.setUTMPosition(JUTMPosition(tripod.getUTMEast(), value, tripod.getUTMZ()));
108 else if (action == addy_t)
109 tripod.add(JUTMPosition(0.0, value, 0.0));
110 else if (action == suby_t)
111 tripod.sub(JUTMPosition(0.0, value, 0.0));
112 else if (action == setz_t)
113 tripod.setUTMPosition(JUTMPosition(tripod.getUTMEast(), tripod.getUTMNorth(), value));
114 else if (action == addz_t)
115 tripod.add(JUTMPosition(0.0, 0.0, value));
116 else if (action == subz_t)
117 tripod.sub(JUTMPosition(0.0, 0.0, value));
133 static bool apply(JTripod& tripod,
const std::string& action,
const JUTMPosition& pos)
135 const JUTMPosition randpos(gRandom->Gaus(0.0, pos.getUTMEast()),
136 gRandom->Gaus(0.0, pos.getUTMNorth()),
137 gRandom->Gaus(0.0, pos.getUTMZ()));
140 tripod.setUTMPosition(pos);
141 else if (action == add_t)
143 else if (action == sub_t)
145 else if (action == randset_t)
146 tripod.setUTMPosition(randpos);
147 else if (action == randadd_t)
149 else if (action == randsub_t)
165 friend inline std::istream&
operator>>(std::istream& in, JModifier& modifier)
167 if (in >> modifier.id >> modifier.action) {
169 modifier.data.clear();
171 for (
double x; in >> x; ) {
172 modifier.data.push_back(x);
175 in.clear(std::ios_base::eofbit);
189 friend inline std::ostream&
operator<<(std::ostream& out,
const JModifier& modifier)
193 out << modifier.action;
195 for (std::vector<double>::const_iterator i = modifier.data.begin(); i != modifier.data.end(); ++i) {
205 std::vector<double> data;
237 typedef JContainer< vector<JTripod> > container_type;
241 vector<JModifier> mod;
250 JParser<> zap(
"Auxiliary program to modify tripod configuration.");
252 zap[
'f'] = make_field(inputFile,
"tripod input file");
253 zap[
'o'] = make_field(outputFile,
"tripod output file");
254 zap[
'T'] = make_field(mod,
"tripod modifier") = JPARSER::initialised();
255 zap[
'A'] = make_field(add,
"add tripod") = JPARSER::initialised();
256 zap[
'r'] = make_field(rm,
"remove tripod[s]") = JPARSER::initialised();
257 zap[
'k'] = make_field(keep,
"keep tripod[s]") = JPARSER::initialised();
258 zap[
'q'] = make_field(squash,
"squash meta data");
259 zap[
'd'] = make_field(debug,
"debug level") = 2;
263 catch(
const exception &error) {
264 FATAL(error.what() << endl);
270 if (!rm.empty() && !keep.empty()) {
271 FATAL(
"Use either option -K or -D." << endl);
276 if (inputFile !=
"") {
278 data.load(inputFile.c_str());
280 catch(
const exception& error) {
286 data.comment.clear();
289 data.comment.add(JMeta(argc, argv));
291 for (vector<JTripod>::const_iterator i = add.begin(); i != add.end(); ++i) {
295 for (vector<JModifier>::const_iterator i = mod.begin(); i != mod.end(); ++i) {
297 for (container_type::iterator target = data.begin(); target != data.end(); ++target) {
299 if (target->getID() == i->id || i->id == WILDCARD) {
301 DEBUG(
"Modifier" <<
' '
302 <<
"(" << FILL(2,
'0') << target->getID() << FILL() <<
")" <<
' '
303 << i->action <<
' ' << JEEPZ() << i->data << endl);
305 if (!i->apply(*target)) {
306 ERROR(
"No valid action: " << *i << endl);
313 for (container_type::iterator target = data.begin(); target != data.end(); ) {
314 if (rm.count(target->getID()) != 0)
315 target = data.erase(target);
322 for (container_type::iterator target = data.begin(); target != data.end(); ) {
323 if (keep.count(target->getID()) == 0)
324 target = data.erase(target);
330 sort(data.begin(), data.end(), make_comparator(&JTripod::getID));
332 data.store(outputFile.c_str());
int main(int argc, char **argv)
std::istream & operator>>(std::istream &in, JACOUSTICS::JFitParameters ¶meters)
Read parameters from input stream.
std::ostream & operator<<(std::ostream &out, const JACOUSTICS::JFitParameters ¶meters)
Write parameters to output stream.