30 inline double getT0(
const JModule& module)
34 for (JModule::const_iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
38 return t0 / module.size();
49 int main(
int argc,
char **argv)
53 string detectorFile_a;
54 string detectorFile_b;
61 JParser<> zap(
"Auxiliary program to find differences between two detector files.");
71 catch(
const exception &error) {
72 FATAL(error.what() << endl);
81 load(detectorFile_a, detector_a);
83 catch(
const JException& error) {
88 load(detectorFile_b, detector_b);
90 catch(
const JException& error) {
97 const JModuleRouter module_router_a(detector_a);
98 const JModuleRouter module_router_b(detector_b);
103 if (detector_a.getID() != detector_b.getID()) {
105 DEBUG(
"* Unequal detector IDs = "
106 << detector_a.getID() <<
" (A) and " << endl
107 << detector_b.getID() <<
" (B)." << endl
116 for (JDetector::iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
118 if (!module_router_b.hasModule(module->getID())) {
120 DEBUG(
"* Module " << module->getID() <<
" is in A (" << module->getString() <<
"," << module->getFloor() <<
") but not in B" << endl);
126 for (JDetector::iterator module = detector_b.begin(); module != detector_b.end(); ++module) {
128 if (!module_router_a.hasModule(module->getID())) {
130 DEBUG(
"* Module " << module->getID() <<
" is in B (" << module->getString() <<
"," << module->getFloor() <<
") but not in A" << endl);
140 DEBUG(
"Comparing module by module." << endl);
142 for (JDetector::iterator module_a = detector_a.begin(); module_a != detector_a.end(); ++module_a) {
144 if (!module_router_b.hasModule(module_a->getID())) {
151 const JModule* module_b = &module_router_b.getModule(module_a->getID());
153 DEBUG(
" Module " << module_a->getID());
157 if (module_a->getLocation() == module_b->getLocation()) {
159 DEBUG(
" (" << module_a->getString() <<
"," << module_a->getFloor() <<
")" << endl);
164 DEBUG(
" * different location: "
165 <<
"(" << module_a->getString() <<
"," << module_a->getFloor() <<
") (A), "
166 <<
"(" << module_b->getString() <<
"," << module_b->getFloor() <<
") (B)" << endl);
173 if (module_a->getPosition().getDistance(module_b->getPosition()) > precision) {
175 DEBUG(
" * different position: "
176 << module_a->getPosition() <<
" (A), "
177 << module_b->getPosition() <<
" (B)"
178 <<
", diff = " << JPosition3D(module_b->getPosition()-module_a->getPosition()) << endl);
185 if (module_a->size() != module_b->size()) {
187 DEBUG(
" * different number of PMTs: "
188 << module_a->size() <<
" (A), "
189 << module_b->size() <<
" (B)" << endl);
196 const double T0A = getT0(*module_a);
197 const double T0B = getT0(*module_b);
199 if (fabs(T0A-T0B) > precision) {
201 DEBUG(
" * different average T0: "
202 << T0A <<
" (A), " << T0B <<
" (B)"
203 <<
", B - A = " << T0B - T0A
213 for (
unsigned int pmt = 0; pmt != module_a->size() && pmt != module_b->size(); ++pmt) {
215 const JPMT& pmt_a = module_a->getPMT(pmt);
216 const JPMT& pmt_b = module_b->getPMT(pmt);
218 if (fabs(pmt_a.getT0() - pmt_b.getT0()) > precision) {
220 DEBUG(
" * different T0 PMT " << pmt <<
": "
221 << pmt_a.getT0() <<
" (A), "
222 << pmt_b.getT0() <<
" (B)"
223 <<
", B - A = " << pmt_b.getT0() - pmt_a.getT0()
232 for (
unsigned int pmt = 0; pmt != module_a->size() && pmt != module_b->size(); ++pmt) {
234 const JPMT& pmt_a = module_a->getPMT(pmt);
235 const JPMT& pmt_b = module_b->getPMT(pmt);
239 if (pmt_a.getPosition().getDistance(pmt_b.getPosition()) > precision) {
241 DEBUG(
" * different PMT position: "
242 << pmt_a.getPosition() <<
" (A" << pmt <<
"), "
243 << pmt_b.getPosition() <<
" (B" << pmt <<
")"
244 <<
", diff = " << JPosition3D(pmt_b.getPosition()-pmt_a.getPosition()) << endl);
252 for (
unsigned int pmt = 0; pmt != module_a->size() && pmt != module_b->size(); ++pmt) {
254 const JPMT& pmt_a = module_a->getPMT(pmt);
255 const JPMT& pmt_b = module_b->getPMT(pmt);
257 if (pmt_a.getStatus() != pmt_b.getStatus()) {
259 DEBUG(
" * different status PMT " << pmt <<
": "
260 << pmt_a.getStatus() <<
" (A), "
261 << pmt_b.getStatus() <<
" (B)"
273 typedef JRange<int> JRange_t;
275 const JRange_t
string =
combine(JRange_t(detector_a.begin(), detector_a.end(), &JModule::getString),
276 JRange_t(detector_b.begin(), detector_b.end(), &JModule::getString));
277 const JRange_t floor =
combine(JRange_t(detector_a.begin(), detector_a.end(), &JModule::getFloor),
278 JRange_t(detector_b.begin(), detector_b.end(), &JModule::getFloor));
283 string.getLength() + 1,
284 string.getLowerLimit() - 0.5,
285 string.getUpperLimit() + 0.5,
286 floor.getLength() + 1,
287 floor.getLowerLimit() - 0.5,
288 floor.getUpperLimit() + 0.5);
290 TH2D* X2 = (TH2D*) M2.Clone(
"X2");
291 TH2D* Y2 = (TH2D*) M2.Clone(
"Y2");
292 TH2D* Z2 = (TH2D*) M2.Clone(
"Z2");
293 TH2D* T2 = (TH2D*) M2.Clone(
"T2");
295 for( JDetector::iterator module = detector_a.begin(); module != detector_a.end(); ++module) {
296 if( !module_router_b.hasModule(module->getID()) ) {
297 M2.Fill(module->getString(), module->getFloor(), -1.0);
301 for( JDetector::iterator module = detector_b.begin(); module != detector_b.end(); ++module) {
302 if( !module_router_a.hasModule(module->getID()) ) {
303 M2.Fill(module->getString(), module->getFloor(), +1.0);
307 for( JDetector::iterator module_a = detector_a.begin(); module_a != detector_a.end(); ++module_a) {
309 if (!module_router_b.hasModule(module_a->getID())) {
313 const JModule* module_b = &module_router_b.getModule(module_a->getID());
315 X2->Fill(module_a->getString(), module_a->getFloor(), module_a->getX() - module_b->getX());
316 Y2->Fill(module_a->getString(), module_a->getFloor(), module_a->getY() - module_b->getY());
317 Z2->Fill(module_a->getString(), module_a->getFloor(), module_a->getZ() - module_b->getZ());
318 T2->Fill(module_a->getString(), module_a->getFloor(), getT0(*module_a) - getT0(*module_b));
321 TH1D *hb =
new TH1D(
"deltaPhiPmts", NULL, 90, -180.0, 180.0);
323 for (JDetector::iterator module_a = detector_a.begin(); module_a != detector_a.end(); ++module_a) {
325 if (!module_router_b.hasModule(module_a->getID())) {
329 const JModule* module_b = &module_router_b.getModule(module_a->getID());
331 for (
unsigned int pmt = 0; pmt != module_a->size() && pmt != module_b->size(); ++pmt) {
333 const JPMT& pmt_a = module_a->getPMT(pmt);
334 const JPMT& pmt_b = module_b->getPMT(pmt);
336 hb->Fill((pmt_a.getPhi() - pmt_b.getPhi()) * 180.0/
PI);
Utility class to parse command line options.
Data structure for a composite optical module.
Data structure for detector geometry and calibration.
#define ASSERT(A)
Assert macro.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
General purpose messaging.
Direct access to module in detector data structure.
Auxiliary class to define a range between two values.
Utility class to parse command line options.
#define DEBUG(A)
Message macros.
int main(int argc, char *argv[])