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[])