00001 #ifndef proto_Config_hh
00002 #define proto_Config_hh
00003
00004 #include <iostream>
00005 #include <string>
00006 #include <fhiclcpp/fwd.h>
00007 #include <artdaq/DAQrate/quiet_mpi.hh>
00008
00009
00010
00011
00012
00013
00014
00015
00016 namespace artdaq {
00017
00021 class Config
00022 {
00023 public:
00027 static const char* usage;
00028
00032 enum TaskType : int
00033 {
00034 TaskSink = 0,
00035 TaskSource = 1,
00036 TaskDetector = 2
00037 };
00038
00048 Config(int rank, int nprocs, int buffer_count, size_t max_payload_size, int argc, char* argv[]);
00049
00054 int destCount() const;
00055
00060 int destStart() const;
00061
00066 int srcCount() const;
00067
00072 int srcStart() const;
00073
00078 int getDestFriend() const;
00079
00084 int getSrcFriend() const;
00085
00092 int getArtArgc(int argc, char* argv[]) const;
00093
00100 char** getArtArgv(int argc, char* argv[]) const;
00101
00106 std::string typeName() const;
00107
00111 void writeInfo() const;
00112
00113
00114 int rank_;
00115 int total_procs_;
00116
00117 int detectors_;
00118 int sources_;
00119 int sinks_;
00120 int detector_start_;
00121 int source_start_;
00122 int sink_start_;
00123
00124 int event_queue_size_;
00125 int run_;
00126
00127 int buffer_count_;
00128 size_t max_payload_size_;
00129
00130
00131 TaskType type_;
00132 int offset_;
00133 std::string node_name_;
00134
00135 int art_argc_;
00136 char** art_argv_;
00137 bool use_artapp_;
00138
00143 void print(std::ostream& ost) const;
00144
00149 void printHeader(std::ostream& ost) const;
00150
00155 fhicl::ParameterSet makeParameterSet() const;
00156
00168 fhicl::ParameterSet getArtPset();
00169
00175 static void throwUsage(char* argv0, const std::string& msg)
00176 {
00177 std::cerr << argv0 << " " << artdaq::Config::usage << "\n";
00178 throw msg;
00179 }
00180
00187 static double getArgDetectors(int argc, char* argv[])
00188 {
00189 if (argc < 2) { throwUsage(argv[0], "no detectors_per_node argument"); }
00190 return atof(argv[1]);
00191 }
00192
00199 static double getArgSinks(int argc, char* argv[])
00200 {
00201 if (argc < 3) { throwUsage(argv[0], "no sinks_per_node argument"); }
00202 return atof(argv[2]);
00203 }
00204
00211 static int getArgQueueSize(int argc, char* argv[])
00212 {
00213 if (argc < 4) { throwUsage(argv[0], "no event_queue_size argument"); }
00214 return atoi(argv[3]);
00215 }
00216
00223 static int getArgRun(int argc, char* argv[])
00224 {
00225 if (argc < 5) { throwUsage(argv[0], "no run argument"); }
00226 return atoi(argv[4]);
00227 }
00228
00233 static std::string getProcessorName()
00234 {
00235 char buf[100];
00236 int sz = sizeof(buf);
00237 MPI_Get_processor_name(buf, &sz);
00238 return std::string(buf);
00239 }
00240 };
00241
00248 inline std::ostream& operator<<(std::ostream& ost, Config const& c)
00249 {
00250 c.print(ost);
00251 return ost;
00252 }
00253 }
00254 #endif