/* Copyright (c) 2019, Anthony Latorre * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ #include "likelihood.h" #include #include "zebra.h" #include "Record_Info.h" #include "event.h" #include "zdab_utils.h" #include "scattering.h" #include "pmt.h" #include "sno_charge.h" #include "db.h" #include "dqxx.h" #include #include /* for sin(), cos(), etc. */ #include /* for gettimeofday() */ #include /* for PRIu32 macro */ #include /* for memcpy() */ #include /* for errno */ #include "pdg.h" #include "optics.h" #include "vector.h" #include "pmt_response.h" #include /* for signal() */ #include "release.h" #include "id_particles.h" #include "misc.h" #include "quad.h" #include "sno.h" #include "find_peaks.h" #include "util.h" #include "dc.h" #include "electron.h" #include "muon.h" #include "proton.h" #include "hdf5.h" #include "hdf5_utils.h" #include #include #include /* Maximum number of fit parameters. Should be at least 4 + 3*MAX_VERTICES. */ #define MAX_PARS 100 /* Maximum number of peaks to search for in Hough transform. */ #define MAX_NPEAKS 10 /* Maximum number of events, primary seed particle tracks, and fits. * * FIXME: I should write out the events, tracks, and fits as they come up * instead of storing them until the end. */ #define MAX_NEVENTS 1000000 char *GitSHA1(void); char *GitDirty(void); static int stop = 0; static int quit = 0; static nlopt_opt opt; #define EV_RECORD 0x45562020 // 'EV ' #define MCTK_RECORD 0x4d43544b // 'MCTK' #define MCVX_RECORD 0x4d435658 // 'MCVX' char *flikelihood; static size_t iter; typedef struct fitParams { event *ev; double dx; double ns; int fast; int print; int id[MAX_VERTICES]; size_t n; int charge_only; int hit_only; } fitParams; int particles[] = { IDP_E_MINUS, IDP_MU_MINUS, }; /* In order to start the fitter close to the minimum, we first do a series of * "quick" minimizations starting at the following points. We keep track of the * parameters with the best likelihood value and then start the "real" * minimization from those parameters. */ static struct startingParameters { double x; double y; double z; } startingParameters[] = { {-800.0,-800.0,-800.0}, {-800.0,-800.0,-700.0}, {-800.0,-800.0,-600.0}, {-800.0,-800.0,-500.0}, {-800.0,-800.0,-400.0}, {-800.0,-800.0,-300.0}, {-800.0,-800.0,-200.0}, {-800.0,-800.0,-100.0}, {-800.0,-800.0, 0.0}, {-800.0,-800.0, 100.0}, {-800.0,-800.0, 200.0}, {-800.0,-800.0, 300.0}, {-800.0,-800.0, 400.0}, {-800.0,-800.0, 500.0}, {-800.0,-800.0, 600.0}, {-800.0,-800.0, 700.0}, {-800.0,-800.0, 800.0}, {-800.0,-700.0,-800.0}, {-800.0,-700.0,-700.0}, {-800.0,-700.0,-600.0}, {-800.0,-700.0,-500.0}, {-800.0,-700.0,-400.0}, {-800.0,-700.0,-300.0}, {-800.0,-700.0,-200.0}, {-800.0,-700.0,-100.0}, {-800.0,-700.0, 0.0}, {-800.0,-700.0, 100.0}, {-800.0,-700.0, 200.0}, {-800.0,-700.0, 300.0}, {-800.0,-700.0, 400.0}, {-800.0,-700.0, 500.0}, {-800.0,-700.0, 600.0}, {-800.0,-700.0, 700.0}, {-800.0,-700.0, 800.0}, {-800.0,-600.0,-800.0}, {-800.0,-600.0,-700.0}, {-800.0,-600.0,-600.0}, {-800.0,-600.0,-500.0}, {-800.0,-600.0,-400.0}, {-800.0,-600.0,-300.0}, {-800.0,-600.0,-200.0}, {-800.0,-600.0,-100.0}, {-800.0,-600.0, 0.0}, {-800.0,-600.0, 100.0}, {-800.0,-600.0, 200.0}, {-800.0,-600.0, 300.0}, {-800.0,-600.0, 400.0}, {-800.0,-600.0, 500.0}, {-800.0,-600.0, 600.0}, {-800.0,-600.0, 700.0}, {-800.0,-600.0, 800.0}, {-800.0,-500.0,-800.0}, {-800.0,-500.0,-700.0}, {-800.0,-500.0,-600.0}, {-800.0,-500.0,-500.0}, {-800.0,-500.0,-400.0}, {-800.0,-500.0,-300.0}, {-800.0,-500.0,-200.0}, {-800.0,-500.0,-100.0}, {-800.0,-500.0, 0.0}, {-800.0,-500.0, 100.0}, {-800.0,-500.0, 200.0}, {-800.0,-500.0, 300.0}, {-800.0,-500.0, 400.0}, {-800.0,-500.0, 500.0}, {-800.0,-500.0, 600.0}, {-800.0,-500.0, 700.0}, {-800.0,-500.0, 800.0}, {-800.0,-400.0,-800.0}, {-800.0,-400.0,-700.0}, {-800.0,-400.0,-600.0}, {-800.0,-400.0,-500.0}, {-800.0,-400.0,-400.0}, {-800.0,-400.0,-300.0}, {-800.0,-400.0,-200.0}, {-800.0,-400.0,-100.0}, {-800.0,-400.0, 0.0}, {-800.0,-400.0, 100.0}, {-800.0,-400.0, 200.0}, {-800.0,-400.0, 300.0}, {-800.0,-400.0, 400.0}, {-800.0,-400.0, 500.0}, {-800.0,-400.0, 600.0}, {-800.0,-400.0, 700.0}, {-800.0,-400.0, 800.0}, {-800.0,-300.0,-800.0}, {-800.0,-300.0,-700.0}, {-800.0,-300.0,-600.0}, {-800.0,-300.0,-500.0}, {-800.0,-300.0,-400.0}, {-800.0,-300.0,-300.0}, {-800.0,-300.0,-200.0}, {-800.0,-300.0,-100.0}, {-800.0,-300.0, 0.0}, {-800.0,-300.0, 100.0}, {-800.0,-300.0, 200.0}, {-800.0,-300.0, 300.0}, {-800.0,-300.0, 400.0}, {-800.0,-300.0, 500.0}, {-800.0,-300.0, 600.0}, {-800.0,-300.0, 700.0}, {-800.0,-300.0, 800.0}, {-800.0,-200.0,-800.0}, {-800.0,-200.0,-700.0}, {-800.0,-200.0,-600.0}, {-800.0,-200.0,-500.0}, {-800.0,-200.0,-400.0}, {-800.0,-200.0,-300.0}, {-800.0,-200.0,-200.0}, {-800.0,-200.0,-100.0}, {-800.0,-200.0, 0.0}, {-800.0,-200.0, 100.0}, {-800.0,-200.0, 200.0}, {-800.0,-200.0, 300.0}, {-800.0,-200.0, 400.0}, {-800.0,-200.0, 500.0}, {-800.0,-200.0, 600.0}, {-800.0,-200.0, 700.0}, {-800.0,-200.0, 800.0}, {-800.0,-100.0,-800.0}, {-800.0,-100.0,-700.0}, {-800.0,-100.0,-600.0}, {-800.0,-100.0,-500.0}, {-800.0,-100.0,-400.0}, {-800.0,-100.0,-300.0}, {-800.0,-100.0,-200.0}, {-800.0,-100.0,-100.0}, {-800.0,-100.0, 0.0}, {-800.0,-100.0, 100.0}, {-800.0,-100.0, 200.0}, {-800.0,-100.0, 300.0}, {-800.0,-100.0, 400.0}, {-800.0,-100.0, 500.0}, {-800.0,-100.0, 600.0}, {-800.0,-100.0, 700.0}, {-800.0,-100.0, 800.0}, {-800.0, 0.0,-800.0}, {-800.0, 0.0,-700.0}, {-800.0, 0.0,-600.0}, {-800.0, 0.0,-500.0}, {-800.0, 0.0,-400.0}, {-800.0, 0.0,-300.0}, {-800.0, 0.0,-200.0}, {-800.0, 0.0,-100.0}, {-800.0, 0.0, 0.0}, {-800.0, 0.0, 100.0}, {-800.0, 0.0, 200.0}, {-800.0, 0.0, 300.0}, {-800.0, 0.0, 400.0}, {-800.0, 0.0, 500.0}, {-800.0, 0.0, 600.0}, {-800.0, 0.0, 700.0}, {-800.0, 0.0, 800.0}, {-800.0, 100.0,-800.0}, {-800.0, 100.0,-700.0}, {-800.0, 100.0,-600.0}, {-800.0, 100.0,-500.0}, {-800.0, 100.0,-400.0}, {-800.0, 100.0,-300.0}, {-800.0, 100.0,-200.0}, {-800.0, 100.0,-100.0}, {-800.0, 100.0, 0.0}, {-800.0, 100.0, 100.0}, {-800.0, 100.0, 200.0}, {-800.0, 100.0, 300.0}, {-800.0, 100.0, 400.0}, {-800.0, 100.0, 500.0}, {-800.0, 100.0, 600.0}, {-800.0, 100.0, 700.0}, {-800.0, 100.0, 800.0}, {-800.0, 200.0,-800.0}, {-800.0, 200.0,-700.0}, {-800.0, 200.0,-600.0}, {-800.0, 200.0,-500.0}, {-800.0, 200.0,-400.0}, {-800.0, 200.0,-300.0}, {-800.0, 200.0,-200.0}, {-800.0, 200.0,-100.0}, {-800.0, 200.0, 0.0}, {-800.0, 200.0, 100.0}, {-800.0, 200.0, 200.0}, {-800.0, 200.0, 300.0}, {-800.0, 200.0, 400.0}, {-800.0, 200.0, 500.0}, {-800.0, 200.0, 600.0}, {-800.0, 200.0, 700.0}, {-800.0, 200.0, 800.0}, {-800.0, 300.0,-800.0}, {-800.0, 300.0,-700.0}, {-800.0, 300.0,-600.0}, {-800.0, 300.0,-500.0}, {-800.0, 300.0,-400.0}, {-800.0, 300.0,-300.0}, {-800.0, 300.0,-200.0}, {-800.0, 300.0,-100.0}, {-800.0, 300.0, 0.0}, {-800.0, 300.0, 100.0}, {-800.0, 300.0, 200.0}, {-800.0, 300.0, 300.0}, {-800.0, 300.0, 400.0}, {-800.0, 300.0, 500.0}, {-800.0, 300.0, 600.0}, {-800.0, 300.0, 700.0}, {-800.0, 300.0, 800.0}, {-800.0, 400.0,-800.0}, {-800.0, 400.0,-700.0}, {-800.0, 400.0,-600.0}, {-800.0, 400.0,-500.0}, {-800.0, 400.0,-400.0}, {-800.0, 400.0,-300.0}, {-800.0, 400.0,-200.0}, {-800.0, 400.0,-100.0}, {-800.0, 400.0, 0.0}, {-800.0, 400.0, 100.0}, {-800.0, 400.0, 200.0}, {-800.0, 400.0, 300.0}, {-800.0, 400.0, 400.0}, {-800.0, 400.0, 500.0}, {-800.0, 400.0, 600.0}, {-800.0, 400.0, 700.0}, {-800.0, 400.0, 800.0}, {-800.0, 500.0,-800.0}, {-800.0, 500.0,-700.0}, {-800.0, 500.0,-600.0}, {-800.0, 500.0,-500.0}, {-800.0, 500.0,-400.0}, {-800.0, 500.0,-300.0}, {-800.0, 500.0,-200.0}, {-800.0, 500.0,-100.0}, {-800.0, 500.0, 0.0}, {-800.0, 500.0, 100.0}, {-800.0, 500.0, 200.0}, {-800.0, 500.0, 300.0}, {-800.0, 500.0, 400.0}, {-800.0, 500.0, 500.0}, {-800.0, 500.0, 600.0}, {-800.0, 500.0, 700.0}, {-800.0, 500.0, 800.0}, {-800.0, 600.0,-800.0}, {-800.0, 600.0,-700.0}, {-800.0, 600.0,-600.0}, {-800.0, 600.0,-500.0}, {-800.0, 600.0,-400.0}, {-800.0, 600.0,-300.0}, {-800.0, 600.0,-200.0}, {-800.0, 600.0,-100.0}, {-800.0, 600.0, 0.0}, {-800.0, 600.0, 100.0}, {-800.0, 600.0, 200.0}, {-800.0, 600.0, 300.0}, {-800.0, 600.0, 400.0}, {-800.0, 600.0, 500.0}, {-800.0, 600.0, 600.0}, {-800.0, 600.0, 700.0}, {-800.0, 600.0, 800.0}, {-800.0, 700.0,-800.0}, {-800.0, 700.0,-700.0}, {-800.0, 700.0,-600.0}, {-800.0, 700.0,-500.0}, {-800.0, 700.0,-400.0}, {-800.0, 700.0,-300.0}, {-800.0, 700.0,-200.0}, {-800.0, 700.0,-100.0}, {-800.0, 700.0, 0.0}, {-800.0, 700.0, 100.0}, {-800.0, 700.0, 200.0}, {-800.0, 700.0, 300.0}, {-800.0, 700.0, 400.0}, {-800.0, 700.0, 500.0}, {-800.0, 700.0, 600.0}, {-800.0, 700.0, 700.0}, {-800.0, 700.0, 800.0}, {-800.0, 800.0,-800.0}, {-800.0, 800.0,-700.0}, {-800.0, 800.0,-600.0}, {-800.0, 800.0,-500.0}, {-800.0, 800.0,-400.0}, {-800.0, 800.0,-300.0}, {-800.0, 800.0,-200.0}, {-800.0, 800.0,-100.0}, {-800.0, 800.0, 0.0}, {-800.0, 800.0, 100.0}, {-800.0, 800.0, 200.0}, {-800.0, 800.0, 300.0}, {-800.0, 800.0, 400.0}, {-800.0, 800.0, 500.0}, {-800.0, 800.0, 600.0}, {-800.0, 800.0, 700.0}, {-800.0, 800.0, 800.0}, {-700.0,-800.0,-800.0}, {-700.0,-800.0,-700.0}, {-700.0,-800.0,-600.0}, {-700.0,-800.0,-500.0}, {-700.0,-800.0,-400.0}, {-700.0,-800.0,-300.0}, {-700.0,-800.0,-200.0}, {-700.0,-800.0,-100.0}, {-700.0,-800.0, 0.0}, {-700.0,-800.0, 100.0}, {-700.0,-800.0, 200.0}, {-700.0,-800.0, 300.0}, {-700.0,-800.0, 400.0}, {-700.0,-800.0, 500.0}, {-700.0,-800.0, 600.0}, {-700.0,-800.0, 700.0}, {-700.0,-800.0, 800.0}, {-700.0,-700.0,-800.0}, {-700.0,-700.0,-700.0}, {-700.0,-700.0,-600.0}, {-700.0,-700.0,-500.0}, {-700.0,-700.0,-400.0}, {-700.0,-700.0,-300.0}, {-700.0,-700.0,-200.0}, {-700.0,-700.0,-100.0}, {-700.0,-700.0, 0.0}, {-700.0,-700.0, 100.0}, {-700.0,-700.0, 200.0}, {-700.0,-700.0, 300.0}, {-700.0,-700.0, 400.0}, {-700.0,-700.0, 500.0}, {-700.0,-700.0, 600.0}, {-700.0,-700.0, 700.0}, {-700.0,-700.0, 800.0}, {-700.0,-600.0,-800.0}, {-700.0,-600.0,-700.0}, {-700.0,-600.0,-600.0}, {-700.0,-600.0,-500.0}, {-700.0,-600.0,-400.0}, {-700.0,-600.0,-300.0}, {-700.0,-600.0,-200.0}, {-700.0,-600.0,-100.0}, {-700.0,-600.0, 0.0}, {-700.0,-600.0, 100.0}, {-700.0,-600.0, 200.0}, {-700.0,-600.0, 300.0}, {-700.0,-600.0, 400.0}, {-700.0,-600.0, 500.0}, {-700.0,-600.0, 600.0}, {-700.0,-600.0, 700.0}, {-700.0,-600.0, 800.0}, {-700.0,-500.0,-800.0}, {-700.0,-500.0,-700.0}, {-700.0,-500.0,-600.0}, {-700.0,-500.0,-500.0}, {-700.0,-500.0,-400.0}, {-700.0,-500.0,-300.0}, {-700.0,-500.0,-200.0}, {-700.0,-500.0,-100.0}, {-700.0,-500.0, 0.0}, {-700.0,-500.0, 100.0}, {-700.0,-500.0, 200.0}, {-700.0,-500.0, 300.0}, {-700.0,-500.0, 400.0}, {-700.0,-500.0, 500.0}, {-700.0,-500.0, 600.0}, {-700.0,-500.0, 700.0}, {-700.0,-500.0, 800.0}, {-700.0,-400.0,-800.0}, {-700.0,-400.0,-700.0}, {-700.0,-400.0,-600.0}, {-700.0,-400.0,-500.0}, {-700.0,-400.0,-400.0}, {-700.0,-400.0,-300.0}, {-700.0,-400.0,-200.0}, {-700.0,-400.0,-100.0}, {-700.0,-400.0, 0.0}, {-700.0,-400.0, 100.0}, {-700.0,-400.0, 200.0}, {-700.0,-400.0, 300.0}, {-700.0,-400.0, 400.0}, {-700.0,-400.0, 500.0}, {-700.0,-400.0, 600.0}, {-700.0,-400.0, 700.0}, {-700.0,-400.0, 800.0}, {-700.0,-300.0,-800.0}, {-700.0,-300.0,-700.0}, {-700.0,-300.0,-600.0}, {-700.0,-300.0,-500.0}, {-700.0,-300.0,-400.0}, {-700.0,-300.0,-300.0}, {-700.0,-300.0,-200.0}, {-700.0,-300.0,-100.0}, {-700.0,-300.0, 0.0}, {-700.0,-300.0, 100.0}, {-700.0,-300.0, 200.0}, {-700.0,-300.0, 300.0}, {-700.0,-300.0, 400.0}, {-700.0,-300.0, 500.0}, {-700.0,-300.0, 600.0}, {-700.0,-300.0, 700.0}, {-700.0,-300.0, 800.0}, {-700.0,-200.0,-800.0}, {-700.0,-200.0,-700.0}, {-700.0,-200.0,-600.0}, {-700.0,-200.0,-500.0}, {-700.0,-200.0,-400.0}, {-700.0,-200.0,-300.0}, {-700.0,-200.0,-200.0}, {-700.0,-200.0,-100.0}, {-700.0,-200.0, 0.0}, {-700.0,-200.0, 100.0}, {-700.0,-200.0, 200.0}, {-700.0,-200.0, 300.0}, {-700.0,-200.0, 400.0}, {-700.0,-200.0, 500.0}, {-700.0,-200.0, 600.0}, {-700.0,-200.0, 700.0}, {-700.0,-200.0, 800.0}, {-700.0,-100.0,-800.0}, {-700.0,-100.0,-700.0}, {-700.0,-100.0,-600.0}, {-700.0,-100.0,-500.0}, {-700.0,-100.0,-400.0}, {-700.0,-100.0,-300.0}, {-700.0,-100.0,-200.0}, {-700.0,-100.0,-100.0}, {-700.0,-100.0, 0.0}, {-700.0,-100.0, 100.0}, {-700.0,-100.0, 200.0}, {-700.0,-100.0, 300.0}, {-700.0,-100.0, 400.0}, {-700.0,-100.0, 500.0}, {-700.0,-100.0, 600.0}, {-700.0,-100.0, 700.0}, {-700.0,-100.0, 800.0}, {-700.0, 0.0,-800.0}, {-700.0, 0.0,-700.0}, {-700.0, 0.0,-600.0}, {-700.0, 0.0,-500.0}, {-700.0, 0.0,-400.0}, {-700.0, 0.0,-300.0}, {-700.0, 0.0,-200.0}, {-700.0, 0.0,-100.0}, {-700.0, 0.0, 0.0}, {-700.0, 0.0, 100.0}, {-700.0, 0.0, 200.0}, {-700.0, 0.0, 300.0}, {-700.0, 0.0, 400.0}, {-700.0, 0.0, 500.0}, {-700.0, 0.0, 600.0}, {-700.0, 0.0, 700.0}, {-700.0, 0.0, 800.0}, {-700.0, 100.0,-800.0}, {-700.0, 100.0,-700.0}, {-700.0, 100.0,-600.0}, {-700.0, 100.0,-500.0}, {-700.0, 100.0,-400.0}, {-700.0, 100.0,-300.0}, {-700.0, 100.0,-200.0}, {-700.0, 100.0,-100.0}, {-700.0, 100.0, 0.0}, {-700.0, 100.0, 100.0}, {-700.0, 100.0, 200.0}, {-700.0, 100.0, 300.0}, {-700.0, 100.0, 400.0}, {-700.0, 100.0, 500.0}, {-700.0, 100.0, 600.0}, {-700.0, 100.0, 700.0}, {-700.0, 100.0, 800.0}, {-700.0, 200.0,-800.0}, {-700.0, 200.0,-700.0}, {-700.0, 200.0,-600.0}, {-700.0, 200.0,-500.0}, {-700.0, 200.0,-400.0}, {-700.0, 200.0,-300.0}, {-700.0, 200.0,-200.0}, {-700.0, 200.0,-100.0}, {-700.0, 200.0, 0.0}, {-700.0, 200.0, 100.0}, {-700.0, 200.0, 200.0}, {-700.0, 200.0, 300.0}, {-700.0, 200.0, 400.0}, {-700.0, 200.0, 500.0}, {-700.0, 200.0, 600.0}, {-700.0, 200.0, 700.0}, {-700.0, 200.0, 800.0}, {-700.0, 300.0,-800.0}, {-700.0, 300.0,-700.0}, {-700.0, 300.0,-600.0}, {-700.0, 300.0,-500.0}, {-700.0, 300.0,-400.0}, {-700.0, 300.0,-300.0}, {-700.0, 300.0,-200.0}, {-700.0, 300.0,-100.0}, {-700.0, 300.0, 0.0}, {-700.0, 300.0, 100.0}, {-700.0, 300.0, 200.0}, {-700.0, 300.0, 300.0}, {-700.0, 300.0, 400.0}, {-700.0, 300.0, 500.0}, {-700.0, 300.0, 600.0}, {-700.0, 300.0, 700.0}, {-700.0, 300.0, 800.0}, {-700.0, 400.0,-800.0}, {-700.0, 400.0,-700.0}, {-700.0, 400.0,-600.0}, {-700.0, 400.0,-500.0}, {-700.0, 400.0,-400.0}, {-700.0, 400.0,-300.0}, {-700.0, 400.0,-200.0}, {-700.0, 400.0,-100.0}, {-700.0, 400.0, 0.0}, {-700.0, 400.0, 100.0}, {-700.0, 400.0, 200.0}, {-700.0, 400.0, 300.0}, {-700.0, 400.0, 400.0}, {-700.0, 400.0, 500.0}, {-700.0, 400.0, 600.0}, {-700.0, 400.0, 700.0}, {-700.0, 400.0, 800.0}, {-700.0, 500.0,-800.0}, {-700.0, 500.0,-700.0}, {-700.0, 500.0,-600.0}, {-700.0, 500.0,-500.0}, {-700.0, 500.0,-400.0}, {-700.0, 500.0,-300.0}, {-700.0, 500.0,-200.0}, {-700.0, 500.0,-100.0}, {-700.0, 500.0, 0.0}, {-700.0, 500.0, 100.0}, {-700.0, 500.0, 200.0}, {-700.0, 500.0, 300.0}, {-700.0, 500.0, 400.0}, {-700.0, 500.0, 500.0}, {-700.0, 500.0, 600.0}, {-700.0, 500.0, 700.0}, {-700.0, 500.0, 800.0}, {-700.0, 600.0,-800.0}, {-700.0, 600.0,-700.0}, {-700.0, 600.0,-600.0}, {-700.0, 600.0,-500.0}, {-700.0, 600.0,-400.0}, {-700.0, 600.0,-300.0}, {-700.0, 600.0,-200.0}, {-700.0, 600.0,-100.0}, {-700.0, 600.0, 0.0}, {-700.0, 600.0, 100.0}, {-700.0, 600.0, 200.0}, {-700.0, 600.0, 300.0}, {-700.0, 600.0, 400.0}, {-700.0, 600.0, 500.0}, {-700.0, 600.0, 600.0}, {-700.0, 600.0, 700.0}, {-700.0, 600.0, 800.0}, {-700.0, 700.0,-800.0}, {-700.0, 700.0,-700.0}, {-700.0, 700.0,-600.0}, {-700.0, 700.0,-500.0}, {-700.0, 700.0,-400.0}, {-700.0, 700.0,-300.0}, {-700.0, 700.0,-200.0}, {-700.0, 700.0,-100.0}, {-700.0, 700.0, 0.0}, {-700.0, 700.0, 100.0}, {-700.0, 700.0, 200.0}, {-700.0, 700.0, 300.0}, {-700.0, 700.0, 400.0}, {-700.0, 700.0, 500.0}, {-700.0, 700.0, 600.0}, {-700.0, 700.0, 700.0}, {-700.0, 700.0, 800.0}, {-700.0, 800.0,-800.0}, {-700.0, 800.0,-700.0}, {-700.0, 800.0,-600.0}, {-700.0, 800.0,-500.0}, {-700.0, 800.0,-400.0}, {-700.0, 800.0,-300.0}, {-700.0, 800.0,-200.0}, {-700.0, 800.0,-100.0}, {-700.0, 800.0, 0.0}, {-700.0, 800.0, 100.0}, {-700.0, 800.0, 200.0}, {-700.0, 800.0, 300.0}, {-700.0, 800.0, 400.0}, {-700.0, 800.0, 500.0}, {-700.0, 800.0, 600.0}, {-700.0, 800.0, 700.0}, {-700.0, 800.0, 800.0}, {-600.0,-800.0,-800.0}, {-600.0,-800.0,-700.0}, {-600.0,-800.0,-600.0}, {-600.0,-800.0,-500.0}, {-600.0,-800.0,-400.0}, {-600.0,-800.0,-300.0}, {-600.0,-800.0,-200.0}, {-600.0,-800.0,-100.0}, {-600.0,-800.0, 0.0}, {-600.0,-800.0, 100.0}, {-600.0,-800.0, 200.0}, {-600.0,-800.0, 300.0}, {-600.0,-800.0, 400.0}, {-600.0,-800.0, 500.0}, {-600.0,-800.0, 600.0}, {-600.0,-800.0, 700.0}, {-600.0,-800.0, 800.0}, {-600.0,-700.0,-800.0}, {-600.0,-700.0,-700.0}, {-600.0,-700.0,-600.0}, {-600.0,-700.0,-500.0}, {-600.0,-700.0,-400.0}, {-600.0,-700.0,-300.0}, {-600.0,-700.0,-200.0}, {-600.0,-700.0,-100.0}, {-600.0,-700.0, 0.0}, {-600.0,-700.0, 100.0}, {-600.0,-700.0, 200.0}, {-600.0,-700.0, 300.0}, {-600.0,-700.0, 400.0}, {-600.0,-700.0, 500.0}, {-600.0,-700.0, 600.0}, {-600.0,-700.0, 700.0}, {-600.0,-700.0, 800.0}, {-600.0,-600.0,-800.0}, {-600.0,-600.0,-700.0}, {-600.0,-600.0,-600.0}, {-600.0,-600.0,-500.0}, {-600.0,-600.0,-400.0}, {-600.0,-600.0,-300.0}, {-600.0,-600.0,-200.0}, {-600.0,-600.0,-100.0}, {-600.0,-600.0, 0.0}, {-600.0,-600.0, 100.0}, {-600.0,-600.0, 200.0}, {-600.0,-600.0, 300.0}, {-600.0,-600.0, 400.0}, {-600.0,-600.0, 500.0}, {-600.0,-600.0, 600.0}, {-600.0,-600.0, 700.0}, {-600.0,-600.0, 800.0}, {-600.0,-500.0,-800.0}, {-600.0,-500.0,-700.0}, {-600.0,-500.0,-600.0}, {-600.0,-500.0,-500.0}, {-600.0,-500.0,-400.0}, {-600.0,-500.0,-300.0}, {-600.0,-500.0,-200.0}, {-600.0,-500.0,-100.0}, {-600.0,-500.0, 0.0}, {-600.0,-500.0, 100.0}, {-600.0,-500.0, 200.0}, {-600.0,-500.0, 300.0}, {-600.0,-500.0, 400.0}, {-600.0,-500.0, 500.0}, {-600.0,-500.0, 600.0}, {-600.0,-500.0, 700.0}, {-600.0,-500.0, 800.0}, {-600.0,-400.0,-800.0}, {-600.0,-400.0,-700.0}, {-600.0,-400.0,-600.0}, {-600.0,-400.0,-500.0}, {-600.0,-400.0,-400.0}, {-600.0,-400.0,-300.0}, {-600.0,-400.0,-200.0}, {-600.0,-400.0,-100.0}, {-600.0,-400.0, 0.0}, {-600.0,-400.0, 100.0}, {-600.0,-400.0, 200.0}, {-600.0,-400.0, 300.0}, {-600.0,-400.0, 400.0}, {-600.0,-400.0, 500.0}, {-600.0,-400.0, 600.0}, {-600.0,-400.0, 700.0}, {-600.0,-400.0, 800.0}, {-600.0,-300.0,-800.0}, {-600.0,-300.0,-700.0}, {-600.0,-300.0,-600.0}, {-600.0,-300.0,-500.0}, {-600.0,-300.0,-400.0}, {-600.0,-300.0,-300.0}, {-600.0,-300.0,-200.0}, {-600.0,-300.0,-100.0}, {-600.0,-300.0, 0.0}, {-600.0,-300.0, 100.0}, {-600.0,-300.0, 200.0}, {-600.0,-300.0, 300.0}, {-600.0,-300.0, 400.0}, {-600.0,-300.0, 500.0}, {-600.0,-300.0, 600.0}, {-600.0,-300.0, 700.0}, {-600.0,-300.0, 800.0}, {-600.0,-200.0,-800.0}, {-600.0,-200.0,-700.0}, {-600.0,-200.0,-600.0}, {-600.0,-200.0,-500.0}, {-600.0,-200.0,-400.0}, {-600.0,-200.0,-300.0}, {-600.0,-200.0,-200.0}, {-600.0,-200.0,-100.0}, {-600.0,-200.0, 0.0}, {-600.0,-200.0, 100.0}, {-600.0,-200.0, 200.0}, {-600.0,-200.0, 300.0}, {-600.0,-200.0, 400.0}, {-600.0,-200.0, 500.0}, {-600.0,-200.0, 600.0}, {-600.0,-200.0, 700.0}, {-600.0,-200.0, 800.0}, {-600.0,-100.0,-800.0}, {-600.0,-100.0,-700.0}, {-600.0,-100.0,-600.0}, {-600.0,-100.0,-500.0}, {-600.0,-100.0,-400.0}, {-600.0,-100.0,-300.0}, {-600.0,-100.0,-200.0}, {-600.0,-100.0,-100.0}, {-600.0,-100.0, 0.0}, {-600.0,-100.0, 100.0}, {-600.0,-100.0, 200.0}, {-600.0,-100.0, 300.0}, {-600.0,-100.0, 400.0}, {-600.0,-100.0, 500.0}, {-600.0,-100.0, 600.0}, {-600.0,-100.0, 700.0}, {-600.0,-100.0, 800.0}, {-600.0, 0.0,-800.0}, {-600.0, 0.0,-700.0}, {-600.0, 0.0,-600.0}, {-600.0, 0.0,-500.0}, {-600.0, 0.0,-400.0}, {-600.0, 0.0,-300.0}, {-600.0, 0.0,-200.0}, {-600.0, 0.0,-100.0}, {-600.0, 0.0, 0.0}, {-600.0, 0.0, 100.0}, {-600.0, 0.0, 200.0}, {-600.0, 0.0, 300.0}, {-600.0, 0.0, 400.0}, {-600.0, 0.0, 500.0}, {-600.0, 0.0, 600.0}, {-600.0, 0.0, 700.0}, {-600.0, 0.0, 800.0}, {-600.0, 100.0,-800.0}, {-600.0, 100.0,-700.0}, {-600.0, 100.0,-600.0}, {-600.0, 100.0,-500.0}, {-600.0, 100.0,-400.0}, {-600.0, 100.0,-300.0}, {-600.0, 100.0,-200.0}, {-600.0, 100.0,-100.0}, {-600.0, 100.0, 0.0}, {-600.0, 100.0, 100.0}, {-600.0, 100.0, 200.0}, {-600.0, 100.0, 300.0}, {-600.0, 100.0, 400.0}, {-600.0, 100.0, 500.0}, {-600.0, 100.0, 600.0}, {-600.0, 100.0, 700.0}, {-600.0, 100.0, 800.0}, {-600.0, 200.0,-800.0}, {-600.0, 200.0,-700.0}, {-600.0, 200.0,-600.0}, {-600.0, 200.0,-500.0}, {-600.0, 200.0,-400.0}, {-600.0, 200.0,-300.0}, {-600.0, 200.0,-200.0}, {-600.0, 200.0,-100.0}, {-600.0, 200.0, 0.0}, {-600.0, 200.0, 100.0}, {-600.0, 200.0, 200.0}, {-600.0, 200.0, 300.0}, {-600.0, 200.0, 400.0}, {-600.0, 200.0, 500.0}, {-600.0, 200.0, 600.0}, {-600.0, 200.0, 700.0}, {-600.0, 200.0, 800.0}, {-600.0, 300.0,-800.0}, {-600.0, 300.0,-700.0}, {-600.0, 300.0,-600.0}, {-600.0, 300.0,-500.0}, {-600.0, 300.0,-400.0}, {-600.0, 300.0,-300.0}, {-600.0, 300.0,-200.0}, {-600.0, 300.0,-100.0}, {-600.0, 300.0, 0.0}, {-600.0, 300.0, 100.0}, {-600.0, 300.0, 200.0}, {-600.0, 300.0, 300.0}, {-600.0, 300.0, 400.0}, {-600.0, 300.0, 500.0}, {-600.0, 300.0, 600.0}, {-600.0, 300.0, 700.0}, {-600.0, 300.0, 800.0}, {-600.0, 400.0,-800.0}, {-600.0, 400.0,-700.0}, {-600.0, 400.0,-600.0}, {-600.0, 400.0,-500.0}, {-600.0, 400.0,-400.0}, {-600.0, 400.0,-300.0}, {-600.0, 400.0,-200.0}, {-600.0, 400.0,-100.0}, {-600.0, 400.0, 0.0}, {-600.0, 400.0, 100.0}, {-600.0, 400.0, 200.0}, {-600.0, 400.0, 300.0}, {-600.0, 400.0, 400.0}, {-600.0, 400.0, 500.0}, {-600.0, 400.0, 600.0}, {-600.0, 400.0, 700.0}, {-600.0, 400.0, 800.0}, {-600.0, 500.0,-800.0}, {-600.0, 500.0,-700.0}, {-600.0, 500.0,-600.0}, {-600.0, 500.0,-500.0}, {-600.0, 500.0,-400.0}, {-600.0, 500.0,-300.0}, {-600.0, 500.0,-200.0}, {-600.0, 500.0,-100.0}, {-600.0, 500.0, 0.0}, {-600.0, 500.0, 100.0}, {-600.0, 500.0, 200.0}, {-600.0, 500.0, 300.0}, {-600.0, 500.0, 400.0}, {-600.0, 500.0, 500.0}, {-600.0, 500.0, 600.0}, {-600.0, 500.0, 700.0}, {-600.0, 500.0, 800.0}, {-600.0, 600.0,-800.0}, {-600.0, 600.0,-700.0}, {-600.0, 600.0,-600.0}, {-600.0, 600.0,-500.0}, {-600.0, 600.0,-400.0}, {-600.0, 600.0,-300.0}, {-600.0, 600.0,-200.0}, {-600.0, 600.0,-100.0}, {-600.0, 600.0, 0.0}, {-600.0, 600.0, 100.0}, {-600.0, 600.0, 200.0}, {-600.0, 600.0, 300.0}, {-600.0, 600.0, 400.0}, {-600.0, 600.0, 500.0}, {-600.0, 600.0, 600.0}, {-600.0, 600.0, 700.0}, {-600.0, 600.0, 800.0}, {-600.0, 700.0,-800.0}, {-600.0, 700.0,-700.0}, {-600.0, 700.0,-600.0}, {-600.0, 700.0,-500.0}, {-600.0, 700.0,-400.0}, {-600.0, 700.0,-300.0}, {-600.0, 700.0,-200.0}, {-600.0, 700.0,-100.0}, {-600.0, 700.0, 0.0}, {-600.0, 700.0, 100.0}, {-600.0, 700.0, 200.0}, {-600.0, 700.0, 300.0}, {-600.0, 700.0, 400.0}, {-600.0, 700.0, 500.0}, {-600.0, 700.0, 600.0}, {-600.0, 700.0, 700.0}, {-600.0, 700.0, 800.0}, {-600.0, 800.0,-800.0}, {-600.0, 800.0,-700.0}, {-600.0, 800.0,-600.0}, {-600.0, 800.0,-500.0}, {-600.0, 800.0,-400.0}, {-600.0, 800.0,-300.0}, {-600.0, 800.0,-200.0}, {-600.0, 800.0,-100.0}, {-600.0, 800.0, 0.0}, {-600.0, 800.0, 100.0}, {-600.0, 800.0, 200.0}, {-600.0, 800.0, 300.0}, {-600.0, 800.0, 400.0}, {-600.0, 800.0, 500.0}, {-600.0, 800.0, 600.0}, {-600.0, 800.0, 700.0}, {-600.0, 800.0, 800.0}, {-500.0,-800.0,-800.0}, {-500.0,-800.0,-700.0}, {-500.0,-800.0,-600.0}, {-500.0,-800.0,-500.0}, {-500.0,-800.0,-400.0}, {-500.0,-800.0,-300.0}, {-500.0,-800.0,-200.0}, {-500.0,-800.0,-100.0}, {-500.0,-800.0, 0.0}, {-500.0,-800.0, 100.0}, {-500.0,-800.0, 200.0}, {-500.0,-800.0, 300.0}, {-500.0,-800.0, 400.0}, {-500.0,-800.0, 500.0}, {-500.0,-800.0, 600.0}, {-500.0,-800.0, 700.0}, {-500.0,-800.0, 800.0}, {-500.0,-700.0,-800.0}, {-500.0,-700.0,-700.0}, {-500.0,-700.0,-600.0}, {-500.0,-700.0,-500.0}, {-500.0,-700.0,-400.0}, {-500.0,-700.0,-300.0}, {-500.0,-700.0,-200.0}, {-500.0,-700.0,-100.0}, {-500.0,-700.0, 0.0}, {-500.0,-700.0, 100.0}, {-500.0,-700.0, 200.0}, {-500.0,-700.0, 300.0}, {-500.0,-700.0, 400.0}, {-500.0,-700.0, 500.0}, {-500.0,-700.0, 600.0}, {-500.0,-700.0, 700.0}, {-500.0,-700.0, 800.0}, {-500.0,-600.0,-800.0}, {-500.0,-600.0,-700.0}, {-500.0,-600.0,-600.0}, {-500.0,-600.0,-500.0}, {-500.0,-600.0,-400.0}, {-500.0,-600.0,-300.0}, {-500.0,-600.0,-200.0}, {-500.0,-600.0,-100.0}, {-500.0,-600.0, 0.0}, {-500.0,-600.0, 100.0}, {-500.0,-600.0, 200.0}, {-500.0,-600.0, 300.0}, {-500.0,-600.0, 400.0}, {-500.0,-600.0, 500.0}, {-500.0,-600.0, 600.0}, {-500.0,-600.0, 700.0}, {-500.0,-600.0, 800.0}, {-500.0,-500.0,-800.0}, {-500.0,-500.0,-700.0}, {-500.0,-500.0,-600.0}, {-500.0,-500.0,-500.0}, {-500.0,-500.0,-400.0}, {-500.0,-500.0,-300.0}, {-500.0,-500.0,-200.0}, {-500.0,-500.0,-100.0}, {-500.0,-500.0, 0.0}, {-500.0,-500.0, 100.0}, {-500.0,-500.0, 200.0}, {-500.0,-500.0, 300.0}, {-500.0,-500.0, 400.0}, {-500.0,-500.0, 500.0}, {-500.0,-500.0, 600.0}, {-500.0,-500.0, 700.0}, {-500.0,-500.0, 800.0}, {-500.0,-400.0,-800.0}, {-500.0,-400.0,-700.0}, {-500.0,-400.0,-600.0}, {-500.0,-400.0,-500.0}, {-500.0,-400.0,-400.0}, {-500.0,-400.0,-300.0}, {-500.0,-400.0,-200.0}, {-500.0,-400.0,-100.0}, {-500.0,-400.0, 0.0}, {-500.0,-400.0, 100.0}, {-500.0,-400.0, 200.0}, {-500.0,-400.0, 300.0}, {-500.0,-400.0, 400.0}, {-500.0,-400.0, 500.0}, {-500.0,-400.0, 600.0}, {-500.0,-400.0, 700.0}, {-500.0,-400.0, 800.0}, {-500.0,-300.0,-800.0}, {-500.0,-300.0,-700.0}, {-500.0,-300.0,-600.0}, {-500.0,-300.0,-500.0}, {-500.0,-300.0,-400.0}, {-500.0,-300.0,-300.0}, {-500.0,-300.0,-200.0}, {-500.0,-300.0,-100.0}, {-500.0,-300.0, 0.0}, {-500.0,-300.0, 100.0}, {-500.0,-300.0, 200.0}, {-500.0,-300.0, 300.0}, {-500.0,-300.0, 400.0}, {-500.0,-300.0, 500.0}, {-500.0,-300.0, 600.0}, {-500.0,-300.0, 700.0}, {-500.0,-300.0, 800.0}, {-500.0,-200.0,-800.0}, {-500.0,-200.0,-700.0}, {-500.0,-200.0,-600.0}, {-500.0,-200.0,-500.0}, {-500.0,-200.0,-400.0}, {-500.0,-200.0,-300.0}, {-500.0,-200.0,-200.0}, {-500.0,-200.0,-100.0}, {-500.0,-200.0, 0.0}, {-500.0,-200.0, 100.0}, {-500.0,-200.0, 200.0}, {-500.0,-200.0, 300.0}, {-500.0,-200.0, 400.0}, {-500.0,-200.0, 500.0}, {-500.0,-200.0, 600.0}, {-500.0,-200.0, 700.0}, {-500.0,-200.0, 800.0}, {-500.0,-100.0,-800.0}, {-500.0,-100.0,-700.0}, {-500.0,-100.0,-600.0}, {-500.0,-100.0,-500.0}, {-500.0,-100.0,-400.0}, {-500.0,-100.0,-300.0}, {-500.0,-100.0,-200.0}, {-500.0,-100.0,-100.0}, {-500.0,-100.0, 0.0}, {-500.0,-100.0, 100.0}, {-500.0,-100.0, 200.0}, {-500.0,-100.0, 300.0}, {-500.0,-100.0, 400.0}, {-500.0,-100.0, 500.0}, {-500.0,-100.0, 600.0}, {-500.0,-100.0, 700.0}, {-500.0,-100.0, 800.0}, {-500.0, 0.0,-800.0}, {-500.0, 0.0,-700.0}, {-500.0, 0.0,-600.0}, {-500.0, 0.0,-500.0}, {-500.0, 0.0,-400.0}, {-500.0, 0.0,-300.0}, {-500.0, 0.0,-200.0}, {-500.0, 0.0,-100.0}, {-500.0, 0.0, 0.0}, {-500.0, 0.0, 100.0}, {-500.0, 0.0, 200.0}, {-500.0, 0.0, 300.0}, {-500.0, 0.0, 400.0}, {-500.0, 0.0, 500.0}, {-500.0, 0.0, 600.0}, {-500.0, 0.0, 700.0}, {-500.0, 0.0, 800.0}, {-500.0, 100.0,-800.0}, {-500.0, 100.0,-700.0}, {-500.0, 100.0,-600.0}, {-500.0, 100.0,-500.0}, {-500.0, 100.0,-400.0}, {-500.0, 100.0,-300.0}, {-500.0, 100.0,-200.0}, {-500.0, 100.0,-100.0}, {-500.0, 100.0, 0.0}, {-500.0, 100.0, 100.0}, {-500.0, 100.0, 200.0}, {-500.0, 100.0, 300.0}, {-500.0, 100.0, 400.0}, {-500.0, 100.0, 500.0}, {-500.0, 100.0, 600.0}, {-500.0, 100.0, 700.0}, {-500.0, 100.0, 800.0}, {-500.0, 200.0,-800.0}, {-500.0, 200.0,-700.0}, {-500.0, 200.0,-600.0}, {-500.0, 200.0,-500.0}, {-500.0, 200.0,-400.0}, {-500.0, 200.0,-300.0}, {-500.0, 200.0,-200.0}, {-500.0, 200.0,-100.0}, {-500.0, 200.0, 0.0}, {-500.0, 200.0, 100.0}, {-500.0, 200.0, 200.0}, {-500.0, 200.0, 300.0}, {-500.0, 200.0, 400.0}, {-500.0, 200.0, 500.0}, {-500.0, 200.0, 600.0}, {-500.0, 200.0, 700.0}, {-500.0, 200.0, 800.0}, {-500.0, 300.0,-800.0}, {-500.0, 300.0,-700.0}, {-500.0, 300.0,-600.0}, {-500.0, 300.0,-500.0}, {-500.0, 300.0,-400.0}, {-500.0, 300.0,-300.0}, {-500.0, 300.0,-200.0}, {-500.0, 300.0,-100.0}, {-500.0, 300.0, 0.0}, {-500.0, 300.0, 100.0}, {-500.0, 300.0, 200.0}, {-500.0, 300.0, 300.0}, {-500.0, 300.0, 400.0}, {-500.0, 300.0, 500.0}, {-500.0, 300.0, 600.0}, {-500.0, 300.0, 700.0}, {-500.0, 300.0, 800.0}, {-500.0, 400.0,-800.0}, {-500.0, 400.0,-700.0}, {-500.0, 400.0,-600.0}, {-500.0, 400.0,-500.0}, {-500.0, 400.0,-400.0}, {-500.0, 400.0,-300.0}, {-500.0, 400.0,-200.0}, {-500.0, 400.0,-100.0}, {-500.0, 400.0, 0.0}, {-500.0, 400.0, 100.0}, {-500.0, 400.0, 200.0}, {-500.0, 400.0, 300.0}, {-500.0, 400.0, 400.0}, {-500.0, 400.0, 500.0}, {-500.0, 400.0, 600.0}, {-500.0, 400.0, 700.0}, {-500.0, 400.0, 800.0}, {-500.0, 500.0,-800.0}, {-500.0, 500.0,-700.0}, {-500.0, 500.0,-600.0}, {-500.0, 500.0,-500.0}, {-500.0, 500.0,-400.0}, {-500.0, 500.0,-300.0}, {-500.0, 500.0,-200.0}, {-500.0, 500.0,-100.0}, {-500.0, 500.0, 0.0}, {-500.0, 500.0, 100.0}, {-500.0, 500.0, 200.0}, {-500.0, 500.0, 300.0}, {-500.0, 500.0, 400.0}, {-500.0, 500.0, 500.0}, {-500.0, 500.0, 600.0}, {-500.0, 500.0, 700.0}, {-500.0, 500.0, 800.0}, {-500.0, 600.0,-800.0}, {-500.0, 600.0,-700.0}, {-500.0, 600.0,-600.0}, {-500.0, 600.0,-500.0}, {-500.0, 600.0,-400.0}, {-500.0, 600.0,-300.0}, {-500.0, 600.0,-200.0}, {-500.0, 600.0,-100.0}, {-500.0, 600.0, 0.0}, {-500.0, 600.0, 100.0}, {-500.0, 600.0, 200.0}, {-500.0, 600.0, 300.0}, {-500.0, 600.0, 400.0}, {-500.0, 600.0, 500.0}, {-500.0, 600.0, 600.0}, {-500.0, 600.0, 700.0}, {-500.0, 600.0, 800.0}, {-500.0, 700.0,-800.0}, {-500.0, 700.0,-700.0}, {-500.0, 700.0,-600.0}, {-500.0, 700.0,-500.0}, {-500.0, 700.0,-400.0}, {-500.0, 700.0,-300.0}, {-500.0, 700.0,-200.0}, {-500.0, 700.0,-100.0}, {-500.0, 700.0, 0.0}, {-500.0, 700.0, 100.0}, {-500.0, 700.0, 200.0}, {-500.0, 700.0, 300.0}, {-500.0, 700.0, 400.0}, {-500.0, 700.0, 500.0}, {-500.0, 700.0, 600.0}, {-500.0, 700.0, 700.0}, {-500.0, 700.0, 800.0}, {-500.0, 800.0,-800.0}, {-500.0, 800.0,-700.0}, {-500.0, 800.0,-600.0}, {-500.0, 800.0,-500.0}, {-500.0, 800.0,-400.0}, {-500.0, 800.0,-300.0}, {-500.0, 800.0,-200.0}, {-500.0, 800.0,-100.0}, {-500.0, 800.0, 0.0}, {-500.0, 800.0, 100.0}, {-500.0, 800.0, 200.0}, {-500.0, 800.0, 300.0}, {-500.0, 800.0, 400.0}, {-500.0, 800.0, 500.0}, {-500.0, 800.0, 600.0}, {-500.0, 800.0, 700.0}, {-500.0, 800.0, 800.0}, {-400.0,-800.0,-800.0}, {-400.0,-800.0,-700.0}, {-400.0,-800.0,-600.0}, {-400.0,-800.0,-500.0}, {-400.0,-800.0,-400.0}, {-400.0,-800.0,-300.0}, {-400.0,-800.0,-200.0}, {-400.0,-800.0,-100.0}, {-400.0,-800.0, 0.0}, {-400.0,-800.0, 100.0}, {-400.0,-800.0, 200.0}, {-400.0,-800.0, 300.0}, {-400.0,-800.0, 400.0}, {-400.0,-800.0, 500.0}, {-400.0,-800.0, 600.0}, {-400.0,-800.0, 700.0}, {-400.0,-800.0, 800.0}, {-400.0,-700.0,-800.0}, {-400.0,-700.0,-700.0}, {-400.0,-700.0,-600.0}, {-400.0,-700.0,-500.0}, {-400.0,-700.0,-400.0}, {-400.0,-700.0,-300.0}, {-400.0,-700.0,-200.0}, {-400.0,-700.0,-100.0}, {-400.0,-700.0, 0.0}, {-400.0,-700.0, 100.0}, {-400.0,-700.0, 200.0}, {-400.0,-700.0, 300.0}, {-400.0,-700.0, 400.0}, {-400.0,-700.0, 500.0}, {-400.0,-700.0, 600.0}, {-400.0,-700.0, 700.0}, {-400.0,-700.0, 800.0}, {-400.0,-600.0,-800.0}, {-400.0,-600.0,-700.0}, {-400.0,-600.0,-600.0}, {-400.0,-600.0,-500.0}, {-400.0,-600.0,-400.0}, {-400.0,-600.0,-300.0}, {-400.0,-600.0,-200.0}, {-400.0,-600.0,-100.0}, {-400.0,-600.0, 0.0}, {-400.0,-600.0, 100.0}, {-400.0,-600.0, 200.0}, {-400.0,-600.0, 300.0}, {-400.0,-600.0, 400.0}, {-400.0,-600.0, 500.0}, {-400.0,-600.0, 600.0}, {-400.0,-600.0, 700.0}, {-400.0,-600.0, 800.0}, {-400.0,-500.0,-800.0}, {-400.0,-500.0,-700.0}, {-400.0,-500.0,-600.0}, {-400.0,-500.0,-500.0}, {-400.0,-500.0,-400.0}, {-400.0,-500.0,-300.0}, {-400.0,-500.0,-200.0}, {-400.0,-500.0,-100.0}, {-400.0,-500.0, 0.0}, {-400.0,-500.0, 100.0}, {-400.0,-500.0, 200.0}, {-400.0,-500.0, 300.0}, {-400.0,-500.0, 400.0}, {-400.0,-500.0, 500.0}, {-400.0,-500.0, 600.0}, {-400.0,-500.0, 700.0}, {-400.0,-500.0, 800.0}, {-400.0,-400.0,-800.0}, {-400.0,-400.0,-700.0}, {-400.0,-400.0,-600.0}, {-400.0,-400.0,-500.0}, {-400.0,-400.0,-400.0}, {-400.0,-400.0,-300.0}, {-400.0,-400.0,-200.0}, {-400.0,-400.0,-100.0}, {-400.0,-400.0, 0.0}, {-400.0,-400.0, 100.0}, {-400.0,-400.0, 200.0}, {-400.0,-400.0, 300.0}, {-400.0,-400.0, 400.0}, {-400.0,-400.0, 500.0}, {-400.0,-400.0, 600.0}, {-400.0,-400.0, 700.0}, {-400.0,-400.0, 800.0}, {-400.0,-300.0,-800.0}, {-400.0,-300.0,-700.0}, {-400.0,-300.0,-600.0}, {-400.0,-300.0,-500.0}, {-400.0,-300.0,-400.0}, {-400.0,-300.0,-300.0}, {-400.0,-300.0,-200.0}, {-400.0,-300.0,-100.0}, {-400.0,-300.0, 0.0}, {-400.0,-300.0, 100.0}, {-400.0,-300.0, 200.0}, {-400.0,-300.0, 300.0}, {-400.0,-300.0, 400.0}, {-400.0,-300.0, 500.0}, {-400.0,-300.0, 600.0}, {-400.0,-300.0, 700.0}, {-400.0,-300.0, 800.0}, {-400.0,-200.0,-800.0}, {-400.0,-200.0,-700.0}, {-400.0,-200.0,-600.0}, {-400.0,-200.0,-500.0}, {-400.0,-200.0,-400.0}, {-400.0,-200.0,-300.0}, {-400.0,-200.0,-200.0}, {-400.0,-200.0,-100.0}, {-400.0,-200.0, 0.0}, {-400.0,-200.0, 100.0}, {-400.0,-200.0, 200.0}, {-400.0,-200.0, 300.0}, {-400.0,-200.0, 400.0}, {-400.0,-200.0, 500.0}, {-400.0,-200.0, 600.0}, {-400.0,-200.0, 700.0}, {-400.0,-200.0, 800.0}, {-400.0,-100.0,-800.0}, {-400.0,-100.0,-700.0}, {-400.0,-100.0,-600.0}, {-400.0,-100.0,-500.0}, {-400.0,-100.0,-400.0}, {-400.0,-100.0,-300.0}, {-400.0,-100.0,-200.0}, {-400.0,-100.0,-100.0}, {-400.0,-100.0, 0.0}, {-400.0,-100.0, 100.0}, {-400.0,-100.0, 200.0}, {-400.0,-100.0, 300.0}, {-400.0,-100.0, 400.0}, {-400.0,-100.0, 500.0}, {-400.0,-100.0, 600.0}, {-400.0,-100.0, 700.0}, {-400.0,-100.0, 800.0}, {-400.0, 0.0,-800.0}, {-400.0, 0.0,-700.0}, {-400.0, 0.0,-600.0}, {-400.0, 0.0,-500.0}, {-400.0, 0.0,-400.0}, {-400.0, 0.0,-300.0}, {-400.0, 0.0,-200.0}, {-400.0, 0.0,-100.0}, {-400.0, 0.0, 0.0}, {-400.0, 0.0, 100.0}, {-400.0, 0.0, 200.0}, {-400.0, 0.0, 300.0}, {-400.0, 0.0, 400.0}, {-400.0, 0.0, 500.0}, {-400.0, 0.0, 600.0}, {-400.0, 0.0, 700.0}, {-400.0, 0.0, 800.0}, {-400.0, 100.0,-800.0}, {-400.0, 100.0,-700.0}, {-400.0, 100.0,-600.0}, {-400.0, 100.0,-500.0}, {-400.0, 100.0,-400.0}, {-400.0, 100.0,-300.0}, {-400.0, 100.0,-200.0}, {-400.0, 100.0,-100.0}, {-400.0, 100.0, 0.0}, {-400.0, 100.0, 100.0}, {-400.0, 100.0, 200.0}, {-400.0, 100.0, 300.0}, {-400.0, 100.0, 400.0}, {-400.0, 100.0, 500.0}, {-400.0, 100.0, 600.0}, {-400.0, 100.0, 700.0}, {-400.0, 100.0, 800.0}, {-400.0, 200.0,-800.0}, {-400.0, 200.0,-700.0}, {-400.0, 200.0,-600.0}, {-400.0, 200.0,-500.0}, {-400.0, 200.0,-400.0}, {-400.0, 200.0,-300.0}, {-400.0, 200.0,-200.0}, {-400.0, 200.0,-100.0}, {-400.0, 200.0, 0.0}, {-400.0, 200.0, 100.0}, {-400.0, 200.0, 200.0}, {-400.0, 200.0, 300.0}, {-400.0, 200.0, 400.0}, {-400.0, 200.0, 500.0}, {-400.0, 200.0, 600.0}, {-400.0, 200.0, 700.0}, {-400.0, 200.0, 800.0}, {-400.0, 300.0,-800.0}, {-400.0, 300.0,-700.0}, {-400.0, 300.0,-600.0}, {-400.0, 300.0,-500.0}, {-400.0, 300.0,-400.0}, {-400.0, 300.0,-300.0}, {-400.0, 300.0,-200.0}, {-400.0, 300.0,-100.0}, {-400.0, 300.0, 0.0}, {-400.0, 300.0, 100.0}, {-400.0, 300.0, 200.0}, {-400.0, 300.0, 300.0}, {-400.0, 300.0, 400.0}, {-400.0, 300.0, 500.0}, {-400.0, 300.0, 600.0}, {-400.0, 300.0, 700.0}, {-400.0, 300.0, 800.0}, {-400.0, 400.0,-800.0}, {-400.0, 400.0,-700.0}, {-400.0, 400.0,-600.0}, {-400.0, 400.0,-500.0}, {-400.0, 400.0,-400.0}, {-400.0, 400.0,-300.0}, {-400.0, 400.0,-200.0}, {-400.0, 400.0,-100.0}, {-400.0, 400.0, 0.0}, {-400.0, 400.0, 100.0}, {-400.0, 400.0, 200.0}, {-400.0, 400.0, 300.0}, {-400.0, 400.0, 400.0}, {-400.0, 400.0, 500.0}, {-400.0, 400.0, 600.0}, {-400.0, 400.0, 700.0}, {-400.0, 400.0, 800.0}, {-400.0, 500.0,-800.0}, {-400.0, 500.0,-700.0}, {-400.0, 500.0,-600.0}, {-400.0, 500.0,-500.0}, {-400.0, 500.0,-400.0}, {-400.0, 500.0,-300.0}, {-400.0, 500.0,-200.0}, {-400.0, 500.0,-100.0}, {-400.0, 500.0, 0.0}, {-400.0, 500.0, 100.0}, {-400.0, 500.0, 200.0}, {-400.0, 500.0, 300.0}, {-400.0, 500.0, 400.0}, {-400.0, 500.0, 500.0}, {-400.0, 500.0, 600.0}, {-400.0, 500.0, 700.0}, {-400.0, 500.0, 800.0}, {-400.0, 600.0,-800.0}, {-400.0, 600.0,-700.0}, {-400.0, 600.0,-600.0}, {-400.0, 600.0,-500.0}, {-400.0, 600.0,-400.0}, {-400.0, 600.0,-300.0}, {-400.0, 600.0,-200.0}, {-400.0, 600.0,-100.0}, {-400.0, 600.0, 0.0}, {-400.0, 600.0, 100.0}, {-400.0, 600.0, 200.0}, {-400.0, 600.0, 300.0}, {-400.0, 600.0, 400.0}, {-400.0, 600.0, 500.0}, {-400.0, 600.0, 600.0}, {-400.0, 600.0, 700.0}, {-400.0, 600.0, 800.0}, {-400.0, 700.0,-800.0}, {-400.0, 700.0,-700.0}, {-400.0, 700.0,-600.0}, {-400.0, 700.0,-500.0}, {-400.0, 700.0,-400.0}, {-400.0, 700.0,-300.0}, {-400.0, 700.0,-200.0}, {-400.0, 700.0,-100.0}, {-400.0, 700.0, 0.0}, {-400.0, 700.0, 100.0}, {-400.0, 700.0, 200.0}, {-400.0, 700.0, 300.0}, {-400.0, 700.0, 400.0}, {-400.0, 700.0, 500.0}, {-400.0, 700.0, 600.0}, {-400.0, 700.0, 700.0}, {-400.0, 700.0, 800.0}, {-400.0, 800.0,-800.0}, {-400.0, 800.0,-700.0}, {-400.0, 800.0,-600.0}, {-400.0, 800.0,-500.0}, {-400.0, 800.0,-400.0}, {-400.0, 800.0,-300.0}, {-400.0, 800.0,-200.0}, {-400.0, 800.0,-100.0}, {-400.0, 800.0, 0.0}, {-400.0, 800.0, 100.0}, {-400.0, 800.0, 200.0}, {-400.0, 800.0, 300.0}, {-400.0, 800.0, 400.0}, {-400.0, 800.0, 500.0}, {-400.0, 800.0, 600.0}, {-400.0, 800.0, 700.0}, {-400.0, 800.0, 800.0}, {-300.0,-800.0,-800.0}, {-300.0,-800.0,-700.0}, {-300.0,-800.0,-600.0}, {-300.0,-800.0,-500.0}, {-300.0,-800.0,-400.0}, {-300.0,-800.0,-300.0}, {-300.0,-800.0,-200.0}, {-300.0,-800.0,-100.0}, {-300.0,-800.0, 0.0}, {-300.0,-800.0, 100.0}, {-300.0,-800.0, 200.0}, {-300.0,-800.0, 300.0}, {-300.0,-800.0, 400.0}, {-300.0,-800.0, 500.0}, {-300.0,-800.0, 600.0}, {-300.0,-800.0, 700.0}, {-300.0,-800.0, 800.0}, {-300.0,-700.0,-800.0}, {-300.0,-700.0,-700.0}, {-300.0,-700.0,-600.0}, {-300.0,-700.0,-500.0}, {-300.0,-700.0,-400.0}, {-300.0,-700.0,-300.0}, {-300.0,-700.0,-200.0}, {-300.0,-700.0,-100.0}, {-300.0,-700.0, 0.0}, {-300.0,-700.0, 100.0}, {-300.0,-700.0, 200.0}, {-300.0,-700.0, 300.0}, {-300.0,-700.0, 400.0}, {-300.0,-700.0, 500.0}, {-300.0,-700.0, 600.0}, {-300.0,-700.0, 700.0}, {-300.0,-700.0, 800.0}, {-300.0,-600.0,-800.0}, {-300.0,-600.0,-700.0}, {-300.0,-600.0,-600.0}, {-300.0,-600.0,-500.0}, {-300.0,-600.0,-400.0}, {-300.0,-600.0,-300.0}, {-300.0,-600.0,-200.0}, {-300.0,-600.0,-100.0}, {-300.0,-600.0, 0.0}, {-300.0,-600.0, 100.0}, {-300.0,-600.0, 200.0}, {-300.0,-600.0, 300.0}, {-300.0,-600.0, 400.0}, {-300.0,-600.0, 500.0}, {-300.0,-600.0, 600.0}, {-300.0,-600.0, 700.0}, {-300.0,-600.0, 800.0}, {-300.0,-500.0,-800.0}, {-300.0,-500.0,-700.0}, {-300.0,-500.0,-600.0}, {-300.0,-500.0,-500.0}, {-300.0,-500.0,-400.0}, {-300.0,-500.0,-300.0}, {-300.0,-500.0,-200.0}, {-300.0,-500.0,-100.0}, {-300.0,-500.0, 0.0}, {-300.0,-500.0, 100.0}, {-300.0,-500.0, 200.0}, {-300.0,-500.0, 300.0}, {-300.0,-500.0, 400.0}, {-300.0,-500.0, 500.0}, {-300.0,-500.0, 600.0}, {-300.0,-500.0, 700.0}, {-300.0,-500.0, 800.0}, {-300.0,-400.0,-800.0}, {-300.0,-400.0,-700.0}, {-300.0,-400.0,-600.0}, {-300.0,-400.0,-500.0}, {-300.0,-400.0,-400.0}, {-300.0,-400.0,-300.0}, {-300.0,-400.0,-200.0}, {-300.0,-400.0,-100.0}, {-300.0,-400.0, 0.0}, {-300.0,-400.0, 100.0}, {-300.0,-400.0, 200.0}, {-300.0,-400.0, 300.0}, {-300.0,-400.0, 400.0}, {-300.0,-400.0, 500.0}, {-300.0,-400.0, 600.0}, {-300.0,-400.0, 700.0}, {-300.0,-400.0, 800.0}, {-300.0,-300.0,-800.0}, {-300.0,-300.0,-700.0}, {-300.0,-300.0,-600.0}, {-300.0,-300.0,-500.0}, {-300.0,-300.0,-400.0}, {-300.0,-300.0,-300.0}, {-300.0,-300.0,-200.0}, {-300.0,-300.0,-100.0}, {-300.0,-300.0, 0.0}, {-300.0,-300.0, 100.0}, {-300.0,-300.0, 200.0}, {-300.0,-300.0, 300.0}, {-300.0,-300.0, 400.0}, {-300.0,-300.0, 500.0}, {-300.0,-300.0, 600.0}, {-300.0,-300.0, 700.0}, {-300.0,-300.0, 800.0}, {-300.0,-200.0,-800.0}, {-300.0,-200.0,-700.0}, {-300.0,-200.0,-600.0}, {-300.0,-200.0,-500.0}, {-300.0,-200.0,-400.0}, {-300.0,-200.0,-300.0}, {-300.0,-200.0,-200.0}, {-300.0,-200.0,-100.0}, {-300.0,-200.0, 0.0}, {-300.0,-200.0, 100.0}, {-300.0,-200.0, 200.0}, {-300.0,-200.0, 300.0}, {-300.0,-200.0, 400.0}, {-300.0,-200.0, 500.0}, {-300.0,-200.0, 600.0}, {-300.0,-200.0, 700.0}, {-300.0,-200.0, 800.0}, {-300.0,-100.0,-800.0}, {-300.0,-100.0,-700.0}, {-300.0,-100.0,-600.0}, {-300.0,-100.0,-500.0}, {-300.0,-100.0,-400.0}, {-300.0,-100.0,-300.0}, {-300.0,-100.0,-200.0}, {-300.0,-100.0,-100.0}, {-300.0,-100.0, 0.0}, {-300.0,-100.0, 100.0}, {-300.0,-100.0, 200.0}, {-300.0,-100.0, 300.0}, {-300.0,-100.0, 400.0}, {-300.0,-100.0, 500.0}, {-300.0,-100.0, 600.0}, {-300.0,-100.0, 700.0}, {-300.0,-100.0, 800.0}, {-300.0, 0.0,-800.0}, {-300.0, 0.0,-700.0}, {-300.0, 0.0,-600.0}, {-300.0, 0.0,-500.0}, {-300.0, 0.0,-400.0}, {-300.0, 0.0,-300.0}, {-300.0, 0.0,-200.0}, {-300.0, 0.0,-100.0}, {-300.0, 0.0, 0.0}, {-300.0, 0.0, 100.0}, {-300.0, 0.0, 200.0}, {-300.0, 0.0, 300.0}, {-300.0, 0.0, 400.0}, {-300.0, 0.0, 500.0}, {-300.0, 0.0, 600.0}, {-300.0, 0.0, 700.0}, {-300.0, 0.0, 800.0}, {-300.0, 100.0,-800.0}, {-300.0, 100.0,-700.0}, {-300.0, 100.0,-600.0}, {-300.0, 100.0,-500.0}, {-300.0, 100.0,-400.0}, {-300.0, 100.0,-300.0}, {-300.0, 100.0,-200.0}, {-300.0, 100.0,-100.0}, {-300.0, 100.0, 0.0}, {-300.0, 100.0, 100.0}, {-300.0, 100.0, 200.0}, {-300.0, 100.0, 300.0}, {-300.0, 100.0, 400.0}, {-300.0, 100.0, 500.0}, {-300.0, 100.0, 600.0}, {-300.0, 100.0, 700.0}, {-300.0, 100.0, 800.0}, {-300.0, 200.0,-800.0}, {-300.0, 200.0,-700.0}, {-300.0, 200.0,-600.0}, {-300.0, 200.0,-500.0}, {-300.0, 200.0,-400.0}, {-300.0, 200.0,-300.0}, {-300.0, 200.0,-200.0}, {-300.0, 200.0,-100.0}, {-300.0, 200.0, 0.0}, {-300.0, 200.0, 100.0}, {-300.0, 200.0, 200.0}, {-300.0, 200.0, 300.0}, {-300.0, 200.0, 400.0}, {-300.0, 200.0, 500.0}, {-300.0, 200.0, 600.0}, {-300.0, 200.0, 700.0}, {-300.0, 200.0, 800.0}, {-300.0, 300.0,-800.0}, {-300.0, 300.0,-700.0}, {-300.0, 300.0,-600.0}, {-300.0, 300.0,-500.0}, {-300.0, 300.0,-400.0}, {-300.0, 300.0,-300.0}, {-300.0, 300.0,-200.0}, {-300.0, 300.0,-100.0}, {-300.0, 300.0, 0.0}, {-300.0, 300.0, 100.0}, {-300.0, 300.0, 200.0}, {-300.0, 300.0, 300.0}, {-300.0, 300.0, 400.0}, {-300.0, 300.0, 500.0}, {-300.0, 300.0, 600.0}, {-300.0, 300.0, 700.0}, {-300.0, 300.0, 800.0}, {-300.0, 400.0,-800.0}, {-300.0, 400.0,-700.0}, {-300.0, 400.0,-600.0}, {-300.0, 400.0,-500.0}, {-300.0, 400.0,-400.0}, {-300.0, 400.0,-300.0}, {-300.0, 400.0,-200.0}, {-300.0, 400.0,-100.0}, {-300.0, 400.0, 0.0}, {-300.0, 400.0, 100.0}, {-300.0, 400.0, 200.0}, {-300.0, 400.0, 300.0}, {-300.0, 400.0, 400.0}, {-300.0, 400.0, 500.0}, {-300.0, 400.0, 600.0}, {-300.0, 400.0, 700.0}, {-300.0, 400.0, 800.0}, {-300.0, 500.0,-800.0}, {-300.0, 500.0,-700.0}, {-300.0, 500.0,-600.0}, {-300.0, 500.0,-500.0}, {-300.0, 500.0,-400.0}, {-300.0, 500.0,-300.0}, {-300.0, 500.0,-200.0}, {-300.0, 500.0,-100.0}, {-300.0, 500.0, 0.0}, {-300.0, 500.0, 100.0}, {-300.0, 500.0, 200.0}, {-300.0, 500.0, 300.0}, {-300.0, 500.0, 400.0}, {-300.0, 500.0, 500.0}, {-300.0, 500.0, 600.0}, {-300.0, 500.0, 700.0}, {-300.0, 500.0, 800.0}, {-300.0, 600.0,-800.0}, {-300.0, 600.0,-700.0}, {-300.0, 600.0,-600.0}, {-300.0, 600.0,-500.0}, {-300.0, 600.0,-400.0}, {-300.0, 600.0,-300.0}, {-300.0, 600.0,-200.0}, {-300.0, 600.0,-100.0}, {-300.0, 600.0, 0.0}, {-300.0, 600.0, 100.0}, {-300.0, 600.0, 200.0}, {-300.0, 600.0, 300.0}, {-300.0, 600.0, 400.0}, {-300.0, 600.0, 500.0}, {-300.0, 600.0, 600.0}, {-300.0, 600.0, 700.0}, {-300.0, 600.0, 800.0}, {-300.0, 700.0,-800.0}, {-300.0, 700.0,-700.0}, {-300.0, 700.0,-600.0}, {-300.0, 700.0,-500.0}, {-300.0, 700.0,-400.0}, {-300.0, 700.0,-300.0}, {-300.0, 700.0,-200.0}, {-300.0, 700.0,-100.0}, {-300.0, 700.0, 0.0}, {-300.0, 700.0, 100.0}, {-300.0, 700.0, 200.0}, {-300.0, 700.0, 300.0}, {-300.0, 700.0, 400.0}, {-300.0, 700.0, 500.0}, {-300.0, 700.0, 600.0}, {-300.0, 700.0, 700.0}, {-300.0, 700.0, 800.0}, {-300.0, 800.0,-800.0}, {-300.0, 800.0,-700.0}, {-300.0, 800.0,-600.0}, {-300.0, 800.0,-500.0}, {-300.0, 800.0,-400.0}, {-300.0, 800.0,-300.0}, {-300.0, 800.0,-200.0}, {-300.0, 800.0,-100.0}, {-300.0, 800.0, 0.0}, {-300.0, 800.0, 100.0}, {-300.0, 800.0, 200.0}, {-300.0, 800.0, 300.0}, {-300.0, 800.0, 400.0}, {-300.0, 800.0, 500.0}, {-300.0, 800.0, 600.0}, {-300.0, 800.0, 700.0}, {-300.0, 800.0, 800.0}, {-200.0,-800.0,-800.0}, {-200.0,-800.0,-700.0}, {-200.0,-800.0,-600.0}, {-200.0,-800.0,-500.0}, {-200.0,-800.0,-400.0}, {-200.0,-800.0,-300.0}, {-200.0,-800.0,-200.0}, {-200.0,-800.0,-100.0}, {-200.0,-800.0, 0.0}, {-200.0,-800.0, 100.0}, {-200.0,-800.0, 200.0}, {-200.0,-800.0, 300.0}, {-200.0,-800.0, 400.0}, {-200.0,-800.0, 500.0}, {-200.0,-800.0, 600.0}, {-200.0,-800.0, 700.0}, {-200.0,-800.0, 800.0}, {-200.0,-700.0,-800.0}, {-200.0,-700.0,-700.0}, {-200.0,-700.0,-600.0}, {-200.0,-700.0,-500.0}, {-200.0,-700.0,-400.0}, {-200.0,-700.0,-300.0}, {-200.0,-700.0,-200.0}, {-200.0,-700.0,-100.0}, {-200.0,-700.0, 0.0}, {-200.0,-700.0, 100.0}, {-200.0,-700.0, 200.0}, {-200.0,-700.0, 300.0}, {-200.0,-700.0, 400.0}, {-200.0,-700.0, 500.0}, {-200.0,-700.0, 600.0}, {-200.0,-700.0, 700.0}, {-200.0,-700.0, 800.0}, {-200.0,-600.0,-800.0}, {-200.0,-600.0,-700.0}, {-200.0,-600.0,-600.0}, {-200.0,-600.0,-500.0}, {-200.0,-600.0,-400.0}, {-200.0,-600.0,-300.0}, {-200.0,-600.0,-200.0}, {-200.0,-600.0,-100.0}, {-200.0,-600.0, 0.0}, {-200.0,-600.0, 100.0}, {-200.0,-600.0, 200.0}, {-200.0,-600.0, 300.0}, {-200.0,-600.0, 400.0}, {-200.0,-600.0, 500.0}, {-200.0,-600.0, 600.0}, {-200.0,-600.0, 700.0}, {-200.0,-600.0, 800.0}, {-200.0,-500.0,-800.0}, {-200.0,-500.0,-700.0}, {-200.0,-500.0,-600.0}, {-200.0,-500.0,-500.0}, {-200.0,-500.0,-400.0}, {-200.0,-500.0,-300.0}, {-200.0,-500.0,-200.0}, {-200.0,-500.0,-100.0}, {-200.0,-500.0, 0.0}, {-200.0,-500.0, 100.0}, {-200.0,-500.0, 200.0}, {-200.0,-500.0, 300.0}, {-200.0,-500.0, 400.0}, {-200.0,-500.0, 500.0}, {-200.0,-500.0, 600.0}, {-200.0,-500.0, 700.0}, {-200.0,-500.0, 800.0}, {-200.0,-400.0,-800.0}, {-200.0,-400.0,-700.0}, {-200.0,-400.0,-600.0}, {-200.0,-400.0,-500.0}, {-200.0,-400.0,-400.0}, {-200.0,-400.0,-300.0}, {-200.0,-400.0,-200.0}, {-200.0,-400.0,-100.0}, {-200.0,-400.0, 0.0}, {-200.0,-400.0, 100.0}, {-200.0,-400.0, 200.0}, {-200.0,-400.0, 300.0}, {-200.0,-400.0, 400.0}, {-200.0,-400.0, 500.0}, {-200.0,-400.0, 600.0}, {-200.0,-400.0, 700.0}, {-200.0,-400.0, 800.0}, {-200.0,-300.0,-800.0}, {-200.0,-300.0,-700.0}, {-200.0,-300.0,-600.0}, {-200.0,-300.0,-500.0}, {-200.0,-300.0,-400.0}, {-200.0,-300.0,-300.0}, {-200.0,-300.0,-200.0}, {-200.0,-300.0,-100.0}, {-200.0,-300.0, 0.0}, {-200.0,-300.0, 100.0}, {-200.0,-300.0, 200.0}, {-200.0,-300.0, 300.0}, {-200.0,-300.0, 400.0}, {-200.0,-300.0, 500.0}, {-200.0,-300.0, 600.0}, {-200.0,-300.0, 700.0}, {-200.0,-300.0, 800.0}, {-200.0,-200.0,-800.0}, {-200.0,-200.0,-700.0}, {-200.0,-200.0,-600.0}, {-200.0,-200.0,-500.0}, {-200.0,-200.0,-400.0}, {-200.0,-200.0,-300.0}, {-200.0,-200.0,-200.0}, {-200.0,-200.0,-100.0}, {-200.0,-200.0, 0.0}, {-200.0,-200.0, 100.0}, {-200.0,-200.0, 200.0}, {-200.0,-200.0, 300.0}, {-200.0,-200.0, 400.0}, {-200.0,-200.0, 500.0}, {-200.0,-200.0, 600.0}, {-200.0,-200.0, 700.0}, {-200.0,-200.0, 800.0}, {-200.0,-100.0,-800.0}, {-200.0,-100.0,-700.0}, {-200.0,-100.0,-600.0}, {-200.0,-100.0,-500.0}, {-200.0,-100.0,-400.0}, {-200.0,-100.0,-300.0}, {-200.0,-100.0,-200.0}, {-200.0,-100.0,-100.0}, {-200.0,-100.0, 0.0}, {-200.0,-100.0, 100.0}, {-200.0,-100.0, 200.0}, {-200.0,-100.0, 300.0}, {-200.0,-100.0, 400.0}, {-200.0,-100.0, 500.0}, {-200.0,-100.0, 600.0}, {-200.0,-100.0, 700.0}, {-200.0,-100.0, 800.0}, {-200.0, 0.0,-800.0}, {-200.0, 0.0,-700.0}, {-200.0, 0.0,-600.0}, {-200.0, 0.0,-500.0}, {-200.0, 0.0,-400.0}, {-200.0, 0.0,-300.0}, {-200.0, 0.0,-200.0}, {-200.0, 0.0,-100.0}, {-200.0, 0.0, 0.0}, {-200.0, 0.0, 100.0}, {-200.0, 0.0, 200.0}, {-200.0, 0.0, 300.0}, {-200.0, 0.0, 400.0}, {-200.0, 0.0, 500.0}, {-200.0, 0.0, 600.0}, {-200.0, 0.0, 700.0}, {-200.0, 0.0, 800.0}, {-200.0, 100.0,-800.0}, {-200.0, 100.0,-700.0}, {-200.0, 100.0,-600.0}, {-200.0, 100.0,-500.0}, {-200.0, 100.0,-400.0}, {-200.0, 100.0,-300.0}, {-200.0, 100.0,-200.0}, {-200.0, 100.0,-100.0}, {-200.0, 100.0, 0.0}, {-200.0, 100.0, 100.0}, {-200.0, 100.0, 200.0}, {-200.0, 100.0, 300.0}, {-200.0, 100.0, 400.0}, {-200.0, 100.0, 500.0}, {-200.0, 100.0, 600.0}, {-200.0, 100.0, 700.0}, {-200.0, 100.0, 800.0}, {-200.0, 200.0,-800.0}, {-200.0, 200.0,-700.0}, {-200.0, 200.0,-600.0}, {-200.0, 200.0,-500.0}, {-200.0, 200.0,-400.0}, {-200.0, 200.0,-300.0}, {-200.0, 200.0,-200.0}, {-200.0, 200.0,-100.0}, {-200.0, 200.0, 0.0}, {-200.0, 200.0, 100.0}, {-200.0, 200.0, 200.0}, {-200.0, 200.0, 300.0}, {-200.0, 200.0, 400.0}, {-200.0, 200.0, 500.0}, {-200.0, 200.0, 600.0}, {-200.0, 200.0, 700.0}, {-200.0, 200.0, 800.0}, {-200.0, 300.0,-800.0}, {-200.0, 300.0,-700.0}, {-200.0, 300.0,-600.0}, {-200.0, 300.0,-500.0}, {-200.0, 300.0,-400.0}, {-200.0, 300.0,-300.0}, {-200.0, 300.0,-200.0}, {-200.0, 300.0,-100.0}, {-200.0, 300.0, 0.0}, {-200.0, 300.0, 100.0}, {-200.0, 300.0, 200.0}, {-200.0, 300.0, 300.0}, {-200.0, 300.0, 400.0}, {-200.0, 300.0, 500.0}, {-200.0, 300.0, 600.0}, {-200.0, 300.0, 700.0}, {-200.0, 300.0, 800.0}, {-200.0, 400.0,-800.0}, {-200.0, 400.0,-700.0}, {-200.0, 400.0,-600.0}, {-200.0, 400.0,-500.0}, {-200.0, 400.0,-400.0}, {-200.0, 400.0,-300.0}, {-200.0, 400.0,-200.0}, {-200.0, 400.0,-100.0}, {-200.0, 400.0, 0.0}, {-200.0, 400.0, 100.0}, {-200.0, 400.0, 200.0}, {-200.0, 400.0, 300.0}, {-200.0, 400.0, 400.0}, {-200.0, 400.0, 500.0}, {-200.0, 400.0, 600.0}, {-200.0, 400.0, 700.0}, {-200.0, 400.0, 800.0}, {-200.0, 500.0,-800.0}, {-200.0, 500.0,-700.0}, {-200.0, 500.0,-600.0}, {-200.0, 500.0,-500.0}, {-200.0, 500.0,-400.0}, {-200.0, 500.0,-300.0}, {-200.0, 500.0,-200.0}, {-200.0, 500.0,-100.0}, {-200.0, 500.0, 0.0}, {-200.0, 500.0, 100.0}, {-200.0, 500.0, 200.0}, {-200.0, 500.0, 300.0}, {-200.0, 500.0, 400.0}, {-200.0, 500.0, 500.0}, {-200.0, 500.0, 600.0}, {-200.0, 500.0, 700.0}, {-200.0, 500.0, 800.0}, {-200.0, 600.0,-800.0}, {-200.0, 600.0,-700.0}, {-200.0, 600.0,-600.0}, {-200.0, 600.0,-500.0}, {-200.0, 600.0,-400.0}, {-200.0, 600.0,-300.0}, {-200.0, 600.0,-200.0}, {-200.0, 600.0,-100.0}, {-200.0, 600.0, 0.0}, {-200.0, 600.0, 100.0}, {-200.0, 600.0, 200.0}, {-200.0, 600.0, 300.0}, {-200.0, 600.0, 400.0}, {-200.0, 600.0, 500.0}, {-200.0, 600.0, 600.0}, {-200.0, 600.0, 700.0}, {-200.0, 600.0, 800.0}, {-200.0, 700.0,-800.0}, {-200.0, 700.0,-700.0}, {-200.0, 700.0,-600.0}, {-200.0, 700.0,-500.0}, {-200.0, 700.0,-400.0}, {-200.0, 700.0,-300.0}, {-200.0, 700.0,-200.0}, {-200.0, 700.0,-100.0}, {-200.0, 700.0, 0.0}, {-200.0, 700.0, 100.0}, {-200.0, 700.0, 200.0}, {-200.0, 700.0, 300.0}, {-200.0, 700.0, 400.0}, {-200.0, 700.0, 500.0}, {-200.0, 700.0, 600.0}, {-200.0, 700.0, 700.0}, {-200.0, 700.0, 800.0}, {-200.0, 800.0,-800.0}, {-200.0, 800.0,-700.0}, {-200.0, 800.0,-600.0}, {-200.0, 800.0,-500.0}, {-200.0, 800.0,-400.0}, {-200.0, 800.0,-300.0}, {-200.0, 800.0,-200.0}, {-200.0, 800.0,-100.0}, {-200.0, 800.0, 0.0}, {-200.0, 800.0, 100.0}, {-200.0, 800.0, 200.0}, {-200.0, 800.0, 300.0}, {-200.0, 800.0, 400.0}, {-200.0, 800.0, 500.0}, {-200.0, 800.0, 600.0}, {-200.0, 800.0, 700.0}, {-200.0, 800.0, 800.0}, {-100.0,-800.0,-800.0}, {-100.0,-800.0,-700.0}, {-100.0,-800.0,-600.0}, {-100.0,-800.0,-500.0}, {-100.0,-800.0,-400.0}, {-100.0,-800.0,-300.0}, {-100.0,-800.0,-200.0}, {-100.0,-800.0,-100.0}, {-100.0,-800.0, 0.0}, {-100.0,-800.0, 100.0}, {-100.0,-800.0, 200.0}, {-100.0,-800.0, 300.0}, {-100.0,-800.0, 400.0}, {-100.0,-800.0, 500.0}, {-100.0,-800.0, 600.0}, {-100.0,-800.0, 700.0}, {-100.0,-800.0, 800.0}, {-100.0,-700.0,-800.0}, {-100.0,-700.0,-700.0}, {-100.0,-700.0,-600.0}, {-100.0,-700.0,-500.0}, {-100.0,-700.0,-400.0}, {-100.0,-700.0,-300.0}, {-100.0,-700.0,-200.0}, {-100.0,-700.0,-100.0}, {-100.0,-700.0, 0.0}, {-100.0,-700.0, 100.0}, {-100.0,-700.0, 200.0}, {-100.0,-700.0, 300.0}, {-100.0,-700.0, 400.0}, {-100.0,-700.0, 500.0}, {-100.0,-700.0, 600.0}, {-100.0,-700.0, 700.0}, {-100.0,-700.0, 800.0}, {-100.0,-600.0,-800.0}, {-100.0,-600.0,-700.0}, {-100.0,-600.0,-600.0}, {-100.0,-600.0,-500.0}, {-100.0,-600.0,-400.0}, {-100.0,-600.0,-300.0}, {-100.0,-600.0,-200.0}, {-100.0,-600.0,-100.0}, {-100.0,-600.0, 0.0}, {-100.0,-600.0, 100.0}, {-100.0,-600.0, 200.0}, {-100.0,-600.0, 300.0}, {-100.0,-600.0, 400.0}, {-100.0,-600.0, 500.0}, {-100.0,-600.0, 600.0}, {-100.0,-600.0, 700.0}, {-100.0,-600.0, 800.0}, {-100.0,-500.0,-800.0}, {-100.0,-500.0,-700.0}, {-100.0,-500.0,-600.0}, {-100.0,-500.0,-500.0}, {-100.0,-500.0,-400.0}, {-100.0,-500.0,-300.0}, {-100.0,-500.0,-200.0}, {-100.0,-500.0,-100.0}, {-100.0,-500.0, 0.0}, {-100.0,-500.0, 100.0}, {-100.0,-500.0, 200.0}, {-100.0,-500.0, 300.0}, {-100.0,-500.0, 400.0}, {-100.0,-500.0, 500.0}, {-100.0,-500.0, 600.0}, {-100.0,-500.0, 700.0}, {-100.0,-500.0, 800.0}, {-100.0,-400.0,-800.0}, {-100.0,-400.0,-700.0}, {-100.0,-400.0,-600.0}, {-100.0,-400.0,-500.0}, {-100.0,-400.0,-400.0}, {-100.0,-400.0,-300.0}, {-100.0,-400.0,-200.0}, {-100.0,-400.0,-100.0}, {-100.0,-400.0, 0.0}, {-100.0,-400.0, 100.0}, {-100.0,-400.0, 200.0}, {-100.0,-400.0, 300.0}, {-100.0,-400.0, 400.0}, {-100.0,-400.0, 500.0}, {-100.0,-400.0, 600.0}, {-100.0,-400.0, 700.0}, {-100.0,-400.0, 800.0}, {-100.0,-300.0,-800.0}, {-100.0,-300.0,-700.0}, {-100.0,-300.0,-600.0}, {-100.0,-300.0,-500.0}, {-100.0,-300.0,-400.0}, {-100.0,-300.0,-300.0}, {-100.0,-300.0,-200.0}, {-100.0,-300.0,-100.0}, {-100.0,-300.0, 0.0}, {-100.0,-300.0, 100.0}, {-100.0,-300.0, 200.0}, {-100.0,-300.0, 300.0}, {-100.0,-300.0, 400.0}, {-100.0,-300.0, 500.0}, {-100.0,-300.0, 600.0}, {-100.0,-300.0, 700.0}, {-100.0,-300.0, 800.0}, {-100.0,-200.0,-800.0}, {-100.0,-200.0,-700.0}, {-100.0,-200.0,-600.0}, {-100.0,-200.0,-500.0}, {-100.0,-200.0,-400.0}, {-100.0,-200.0,-300.0}, {-100.0,-200.0,-200.0}, {-100.0,-200.0,-100.0}, {-100.0,-200.0, 0.0}, {-100.0,-200.0, 100.0}, {-100.0,-200.0, 200.0}, {-100.0,-200.0, 300.0}, {-100.0,-200.0, 400.0}, {-100.0,-200.0, 500.0}, {-100.0,-200.0, 600.0}, {-100.0,-200.0, 700.0}, {-100.0,-200.0, 800.0}, {-100.0,-100.0,-800.0}, {-100.0,-100.0,-700.0}, {-100.0,-100.0,-600.0}, {-100.0,-100.0,-500.0}, {-100.0,-100.0,-400.0}, {-100.0,-100.0,-300.0}, {-100.0,-100.0,-200.0}, {-100.0,-100.0,-100.0}, {-100.0,-100.0, 0.0}, {-100.0,-100.0, 100.0}, {-100.0,-100.0, 200.0}, {-100.0,-100.0, 300.0}, {-100.0,-100.0, 400.0}, {-100.0,-100.0, 500.0}, {-100.0,-100.0, 600.0}, {-100.0,-100.0, 700.0}, {-100.0,-100.0, 800.0}, {-100.0, 0.0,-800.0}, {-100.0, 0.0,-700.0}, {-100.0, 0.0,-600.0}, {-100.0, 0.0,-500.0}, {-100.0, 0.0,-400.0}, {-100.0, 0.0,-300.0}, {-100.0, 0.0,-200.0}, {-100.0, 0.0,-100.0}, {-100.0, 0.0, 0.0}, {-100.0, 0.0, 100.0}, {-100.0, 0.0, 200.0}, {-100.0, 0.0, 300.0}, {-100.0, 0.0, 400.0}, {-100.0, 0.0, 500.0}, {-100.0, 0.0, 600.0}, {-100.0, 0.0, 700.0}, {-100.0, 0.0, 800.0}, {-100.0, 100.0,-800.0}, {-100.0, 100.0,-700.0}, {-100.0, 100.0,-600.0}, {-100.0, 100.0,-500.0}, {-100.0, 100.0,-400.0}, {-100.0, 100.0,-300.0}, {-100.0, 100.0,-200.0}, {-100.0, 100.0,-100.0}, {-100.0, 100.0, 0.0}, {-100.0, 100.0, 100.0}, {-100.0, 100.0, 200.0}, {-100.0, 100.0, 300.0}, {-100.0, 100.0, 400.0}, {-100.0, 100.0, 500.0}, {-100.0, 100.0, 600.0}, {-100.0, 100.0, 700.0}, {-100.0, 100.0, 800.0}, {-100.0, 200.0,-800.0}, {-100.0, 200.0,-700.0}, {-100.0, 200.0,-600.0}, {-100.0, 200.0,-500.0}, {-100.0, 200.0,-400.0}, {-100.0, 200.0,-300.0}, {-100.0, 200.0,-200.0}, {-100.0, 200.0,-100.0}, {-100.0, 200.0, 0.0}, {-100.0, 200.0, 100.0}, {-100.0, 200.0, 200.0}, {-100.0, 200.0, 300.0}, {-100.0, 200.0, 400.0}, {-100.0, 200.0, 500.0}, {-100.0, 200.0, 600.0}, {-100.0, 200.0, 700.0}, {-100.0, 200.0, 800.0}, {-100.0, 300.0,-800.0}, {-100.0, 300.0,-700.0}, {-100.0, 300.0,-600.0}, {-100.0, 300.0,-500.0}, {-100.0, 300.0,-400.0}, {-100.0, 300.0,-300.0}, {-100.0, 300.0,-200.0}, {-100.0, 300.0,-100.0}, {-100.0, 300.0, 0.0}, {-100.0, 300.0, 100.0}, {-100.0, 300.0, 200.0}, {-100.0, 300.0, 300.0}, {-100.0, 300.0, 400.0}, {-100.0, 300.0, 500.0}, {-100.0, 300.0, 600.0}, {-100.0, 300.0, 700.0}, {-100.0, 300.0, 800.0}, {-100.0, 400.0,-800.0}, {-100.0, 400.0,-700.0}, {-100.0, 400.0,-600.0}, {-100.0, 400.0,-500.0}, {-100.0, 400.0,-400.0}, {-100.0, 400.0,-300.0}, {-100.0, 400.0,-200.0}, {-100.0, 400.0,-100.0}, {-100.0, 400.0, 0.0}, {-100.0, 400.0, 100.0}, {-100.0, 400.0, 200.0}, {-100.0, 400.0, 300.0}, {-100.0, 400.0, 400.0}, {-100.0, 400.0, 500.0}, {-100.0, 400.0, 600.0}, {-100.0, 400.0, 700.0}, {-100.0, 400.0, 800.0}, {-100.0, 500.0,-800.0}, {-100.0, 500.0,-700.0}, {-100.0, 500.0,-600.0}, {-100.0, 500.0,-500.0}, {-100.0, 500.0,-400.0}, {-100.0, 500.0,-300.0}, {-100.0, 500.0,-200.0}, {-100.0, 500.0,-100.0}, {-100.0, 500.0, 0.0}, {-100.0, 500.0, 100.0}, {-100.0, 500.0, 200.0}, {-100.0, 500.0, 300.0}, {-100.0, 500.0, 400.0}, {-100.0, 500.0, 500.0}, {-100.0, 500.0, 600.0}, {-100.0, 500.0, 700.0}, {-100.0, 500.0, 800.0}, {-100.0, 600.0,-800.0}, {-100.0, 600.0,-700.0}, {-100.0, 600.0,-600.0}, {-100.0, 600.0,-500.0}, {-100.0, 600.0,-400.0}, {-100.0, 600.0,-300.0}, {-100.0, 600.0,-200.0}, {-100.0, 600.0,-100.0}, {-100.0, 600.0, 0.0}, {-100.0, 600.0, 100.0}, {-100.0, 600.0, 200.0}, {-100.0, 600.0, 300.0}, {-100.0, 600.0, 400.0}, {-100.0, 600.0, 500.0}, {-100.0, 600.0, 600.0}, {-100.0, 600.0, 700.0}, {-100.0, 600.0, 800.0}, {-100.0, 700.0,-800.0}, {-100.0, 700.0,-700.0}, {-100.0, 700.0,-600.0}, {-100.0, 700.0,-500.0}, {-100.0, 700.0,-400.0}, {-100.0, 700.0,-300.0}, {-100.0, 700.0,-200.0}, {-100.0, 700.0,-100.0}, {-100.0, 700.0, 0.0}, {-100.0, 700.0, 100.0}, {-100.0, 700.0, 200.0}, {-100.0, 700.0, 300.0}, {-100.0, 700.0, 400.0}, {-100.0, 700.0, 500.0}, {-100.0, 700.0, 600.0}, {-100.0, 700.0, 700.0}, {-100.0, 700.0, 800.0}, {-100.0, 800.0,-800.0}, {-100.0, 800.0,-700.0}, {-100.0, 800.0,-600.0}, {-100.0, 800.0,-500.0}, {-100.0, 800.0,-400.0}, {-100.0, 800.0,-300.0}, {-100.0, 800.0,-200.0}, {-100.0, 800.0,-100.0}, {-100.0, 800.0, 0.0}, {-100.0, 800.0, 100.0}, {-100.0, 800.0, 200.0}, {-100.0, 800.0, 300.0}, {-100.0, 800.0, 400.0}, {-100.0, 800.0, 500.0}, {-100.0, 800.0, 600.0}, {-100.0, 800.0, 700.0}, {-100.0, 800.0, 800.0}, { 0.0,-800.0,-800.0}, { 0.0,-800.0,-700.0}, { 0.0,-800.0,-600.0}, { 0.0,-800.0,-500.0}, { 0.0,-800.0,-400.0}, { 0.0,-800.0,-300.0}, { 0.0,-800.0,-200.0}, { 0.0,-800.0,-100.0}, { 0.0,-800.0, 0.0}, { 0.0,-800.0, 100.0}, { 0.0,-800.0, 200.0}, { 0.0,-800.0, 300.0}, { 0.0,-800.0, 400.0}, { 0.0,-800.0, 500.0}, { 0.0,-800.0, 600.0}, { 0.0,-800.0, 700.0}, { 0.0,-800.0, 800.0}, { 0.0,-700.0,-800.0}, { 0.0,-700.0,-700.0}, { 0.0,-700.0,-600.0}, { 0.0,-700.0,-500.0}, { 0.0,-700.0,-400.0}, { 0.0,-700.0,-300.0}, { 0.0,-700.0,-200.0}, { 0.0,-700.0,-100.0}, { 0.0,-700.0, 0.0}, { 0.0,-700.0, 100.0}, { 0.0,-700.0, 200.0}, { 0.0,-700.0, 300.0}, { 0.0,-700.0, 400.0}, { 0.0,-700.0, 500.0}, { 0.0,-700.0, 600.0}, { 0.0,-700.0, 700.0}, { 0.0,-700.0, 800.0}, { 0.0,-600.0,-800.0}, { 0.0,-600.0,-700.0}, { 0.0,-600.0,-600.0}, { 0.0,-600.0,-500.0}, { 0.0,-600.0,-400.0}, { 0.0,-600.0,-300.0}, { 0.0,-600.0,-200.0}, { 0.0,-600.0,-100.0}, { 0.0,-600.0, 0.0}, { 0.0,-600.0, 100.0}, { 0.0,-600.0, 200.0}, { 0.0,-600.0, 300.0}, { 0.0,-600.0, 400.0}, { 0.0,-600.0, 500.0}, { 0.0,-600.0, 600.0}, { 0.0,-600.0, 700.0}, { 0.0,-600.0, 800.0}, { 0.0,-500.0,-800.0}, { 0.0,-500.0,-700.0}, { 0.0,-500.0,-600.0}, { 0.0,-500.0,-500.0}, { 0.0,-500.0,-400.0}, { 0.0,-500.0,-300.0}, { 0.0,-500.0,-200.0}, { 0.0,-500.0,-100.0}, { 0.0,-500.0, 0.0}, { 0.0,-500.0, 100.0}, { 0.0,-500.0, 200.0}, { 0.0,-500.0, 300.0}, { 0.0,-500.0, 400.0}, { 0.0,-500.0, 500.0}, { 0.0,-500.0, 600.0}, { 0.0,-500.0, 700.0}, { 0.0,-500.0, 800.0}, { 0.0,-400.0,-800.0}, { 0.0,-400.0,-700.0}, { 0.0,-400.0,-600.0}, { 0.0,-400.0,-500.0}, { 0.0,-400.0,-400.0}, { 0.0,-400.0,-300.0}, { 0.0,-400.0,-200.0}, { 0.0,-400.0,-100.0}, { 0.0,-400.0, 0.0}, { 0.0,-400.0, 100.0}, { 0.0,-400.0, 200.0}, { 0.0,-400.0, 300.0}, { 0.0,-400.0, 400.0}, { 0.0,-400.0, 500.0}, { 0.0,-400.0, 600.0}, { 0.0,-400.0, 700.0}, { 0.0,-400.0, 800.0}, { 0.0,-300.0,-800.0}, { 0.0,-300.0,-700.0}, { 0.0,-300.0,-600.0}, { 0.0,-300.0,-500.0}, { 0.0,-300.0,-400.0}, { 0.0,-300.0,-300.0}, { 0.0,-300.0,-200.0}, { 0.0,-300.0,-100.0}, { 0.0,-300.0, 0.0}, { 0.0,-300.0, 100.0}, { 0.0,-300.0, 200.0}, { 0.0,-300.0, 300.0}, { 0.0,-300.0, 400.0}, { 0.0,-300.0, 500.0}, { 0.0,-300.0, 600.0}, { 0.0,-300.0, 700.0}, { 0.0,-300.0, 800.0}, { 0.0,-200.0,-800.0}, { 0.0,-200.0,-700.0}, { 0.0,-200.0,-600.0}, { 0.0,-200.0,-500.0}, { 0.0,-200.0,-400.0}, { 0.0,-200.0,-300.0}, { 0.0,-200.0,-200.0}, { 0.0,-200.0,-100.0}, { 0.0,-200.0, 0.0}, { 0.0,-200.0, 100.0}, { 0.0,-200.0, 200.0}, { 0.0,-200.0, 300.0}, { 0.0,-200.0, 400.0}, { 0.0,-200.0, 500.0}, { 0.0,-200.0, 600.0}, { 0.0,-200.0, 700.0}, { 0.0,-200.0, 800.0}, { 0.0,-100.0,-800.0}, { 0.0,-100.0,-700.0}, { 0.0,-100.0,-600.0}, { 0.0,-100.0,-500.0}, { 0.0,-100.0,-400.0}, { 0.0,-100.0,-300.0}, { 0.0,-100.0,-200.0}, { 0.0,-100.0,-100.0}, { 0.0,-100.0, 0.0}, { 0.0,-100.0, 100.0}, { 0.0,-100.0, 200.0}, { 0.0,-100.0, 300.0}, { 0.0,-100.0, 400.0}, { 0.0,-100.0, 500.0}, { 0.0,-100.0, 600.0}, { 0.0,-100.0, 700.0}, { 0.0,-100.0, 800.0}, { 0.0, 0.0,-800.0}, { 0.0, 0.0,-700.0}, { 0.0, 0.0,-600.0}, { 0.0, 0.0,-500.0}, { 0.0, 0.0,-400.0}, { 0.0, 0.0,-300.0}, { 0.0, 0.0,-200.0}, { 0.0, 0.0,-100.0}, { 0.0, 0.0, 0.0}, { 0.0, 0.0, 100.0}, { 0.0, 0.0, 200.0}, { 0.0, 0.0, 300.0}, { 0.0, 0.0, 400.0}, { 0.0, 0.0, 500.0}, { 0.0, 0.0, 600.0}, { 0.0, 0.0, 700.0}, { 0.0, 0.0, 800.0}, { 0.0, 100.0,-800.0}, { 0.0, 100.0,-700.0}, { 0.0, 100.0,-600.0}, { 0.0, 100.0,-500.0}, { 0.0, 100.0,-400.0}, { 0.0, 100.0,-300.0}, { 0.0, 100.0,-200.0}, { 0.0, 100.0,-100.0}, { 0.0, 100.0, 0.0}, { 0.0, 100.0, 100.0}, { 0.0, 100.0, 200.0}, { 0.0, 100.0, 300.0}, { 0.0, 100.0, 400.0}, { 0.0, 100.0, 500.0}, { 0.0, 100.0, 600.0}, { 0.0, 100.0, 700.0}, { 0.0, 100.0, 800.0}, { 0.0, 200.0,-800.0}, { 0.0, 200.0,-700.0}, { 0.0, 200.0,-600.0}, { 0.0, 200.0,-500.0}, { 0.0, 200.0,-400.0}, { 0.0, 200.0,-300.0}, { 0.0, 200.0,-200.0}, { 0.0, 200.0,-100.0}, { 0.0, 200.0, 0.0}, { 0.0, 200.0, 100.0}, { 0.0, 200.0, 200.0}, { 0.0, 200.0, 300.0}, { 0.0, 200.0, 400.0}, { 0.0, 200.0, 500.0}, { 0.0, 200.0, 600.0}, { 0.0, 200.0, 700.0}, { 0.0, 200.0, 800.0}, { 0.0, 300.0,-800.0}, { 0.0, 300.0,-700.0}, { 0.0, 300.0,-600.0}, { 0.0, 300.0,-500.0}, { 0.0, 300.0,-400.0}, { 0.0, 300.0,-300.0}, { 0.0, 300.0,-200.0}, { 0.0, 300.0,-100.0}, { 0.0, 300.0, 0.0}, { 0.0, 300.0, 100.0}, { 0.0, 300.0, 200.0}, { 0.0, 300.0, 300.0}, { 0.0, 300.0, 400.0}, { 0.0, 300.0, 500.0}, { 0.0, 300.0, 600.0}, { 0.0, 300.0, 700.0}, { 0.0, 300.0, 800.0}, { 0.0, 400.0,-800.0}, { 0.0, 400.0,-700.0}, { 0.0, 400.0,-600.0}, { 0.0, 400.0,-500.0}, { 0.0, 400.0,-400.0}, { 0.0, 400.0,-300.0}, { 0.0, 400.0,-200.0}, { 0.0, 400.0,-100.0}, { 0.0, 400.0, 0.0}, { 0.0, 400.0, 100.0}, { 0.0, 400.0, 200.0}, { 0.0, 400.0, 300.0}, { 0.0, 400.0, 400.0}, { 0.0, 400.0, 500.0}, { 0.0, 400.0, 600.0}, { 0.0, 400.0, 700.0}, { 0.0, 400.0, 800.0}, { 0.0, 500.0,-800.0}, { 0.0, 500.0,-700.0}, { 0.0, 500.0,-600.0}, { 0.0, 500.0,-500.0}, { 0.0, 500.0,-400.0}, { 0.0, 500.0,-300.0}, { 0.0, 500.0,-200.0}, { 0.0, 500.0,-100.0}, { 0.0, 500.0, 0.0}, { 0.0, 500.0, 100.0}, { 0.0, 500.0, 200.0}, { 0.0, 500.0, 300.0}, { 0.0, 500.0, 400.0}, { 0.0, 500.0, 500.0}, { 0.0, 500.0, 600.0}, { 0.0, 500.0, 700.0}, { 0.0, 500.0, 800.0}, { 0.0, 600.0,-800.0}, { 0.0, 600.0,-700.0}, { 0.0, 600.0,-600.0}, { 0.0, 600.0,-500.0}, { 0.0, 600.0,-400.0}, { 0.0, 600.0,-300.0}, { 0.0, 600.0,-200.0}, { 0.0, 600.0,-100.0}, { 0.0, 600.0, 0.0}, { 0.0, 600.0, 100.0}, { 0.0, 600.0, 200.0}, { 0.0, 600.0, 300.0}, { 0.0, 600.0, 400.0}, { 0.0, 600.0, 500.0}, { 0.0, 600.0, 600.0}, { 0.0, 600.0, 700.0}, { 0.0, 600.0, 800.0}, { 0.0, 700.0,-800.0}, { 0.0, 700.0,-700.0}, { 0.0, 700.0,-600.0}, { 0.0, 700.0,-500.0}, { 0.0, 700.0,-400.0}, { 0.0, 700.0,-300.0}, { 0.0, 700.0,-200.0}, { 0.0, 700.0,-100.0}, { 0.0, 700.0, 0.0}, { 0.0, 700.0, 100.0}, { 0.0, 700.0, 200.0}, { 0.0, 700.0, 300.0}, { 0.0, 700.0, 400.0}, { 0.0, 700.0, 500.0}, { 0.0, 700.0, 600.0}, { 0.0, 700.0, 700.0}, { 0.0, 700.0, 800.0}, { 0.0, 800.0,-800.0}, { 0.0, 800.0,-700.0}, { 0.0, 800.0,-600.0}, { 0.0, 800.0,-500.0}, { 0.0, 800.0,-400.0}, { 0.0, 800.0,-300.0}, { 0.0, 800.0,-200.0}, { 0.0, 800.0,-100.0}, { 0.0, 800.0, 0.0}, { 0.0, 800.0, 100.0}, { 0.0, 800.0, 200.0}, { 0.0, 800.0, 300.0}, { 0.0, 800.0, 400.0}, { 0.0, 800.0, 500.0}, { 0.0, 800.0, 600.0}, { 0.0, 800.0, 700.0}, { 0.0, 800.0, 800.0}, { 100.0,-800.0,-800.0}, { 100.0,-800.0,-700.0}, { 100.0,-800.0,-600.0}, { 100.0,-800.0,-500.0}, { 100.0,-800.0,-400.0}, { 100.0,-800.0,-300.0}, { 100.0,-800.0,-200.0}, { 100.0,-800.0,-100.0}, { 100.0,-800.0, 0.0}, { 100.0,-800.0, 100.0}, { 100.0,-800.0, 200.0}, { 100.0,-800.0, 300.0}, { 100.0,-800.0, 400.0}, { 100.0,-800.0, 500.0}, { 100.0,-800.0, 600.0}, { 100.0,-800.0, 700.0}, { 100.0,-800.0, 800.0}, { 100.0,-700.0,-800.0}, { 100.0,-700.0,-700.0}, { 100.0,-700.0,-600.0}, { 100.0,-700.0,-500.0}, { 100.0,-700.0,-400.0}, { 100.0,-700.0,-300.0}, { 100.0,-700.0,-200.0}, { 100.0,-700.0,-100.0}, { 100.0,-700.0, 0.0}, { 100.0,-700.0, 100.0}, { 100.0,-700.0, 200.0}, { 100.0,-700.0, 300.0}, { 100.0,-700.0, 400.0}, { 100.0,-700.0, 500.0}, { 100.0,-700.0, 600.0}, { 100.0,-700.0, 700.0}, { 100.0,-700.0, 800.0}, { 100.0,-600.0,-800.0}, { 100.0,-600.0,-700.0}, { 100.0,-600.0,-600.0}, { 100.0,-600.0,-500.0}, { 100.0,-600.0,-400.0}, { 100.0,-600.0,-300.0}, { 100.0,-600.0,-200.0}, { 100.0,-600.0,-100.0}, { 100.0,-600.0, 0.0}, { 100.0,-600.0, 100.0}, { 100.0,-600.0, 200.0}, { 100.0,-600.0, 300.0}, { 100.0,-600.0, 400.0}, { 100.0,-600.0, 500.0}, { 100.0,-600.0, 600.0}, { 100.0,-600.0, 700.0}, { 100.0,-600.0, 800.0}, { 100.0,-500.0,-800.0}, { 100.0,-500.0,-700.0}, { 100.0,-500.0,-600.0}, { 100.0,-500.0,-500.0}, { 100.0,-500.0,-400.0}, { 100.0,-500.0,-300.0}, { 100.0,-500.0,-200.0}, { 100.0,-500.0,-100.0}, { 100.0,-500.0, 0.0}, { 100.0,-500.0, 100.0}, { 100.0,-500.0, 200.0}, { 100.0,-500.0, 300.0}, { 100.0,-500.0, 400.0}, { 100.0,-500.0, 500.0}, { 100.0,-500.0, 600.0}, { 100.0,-500.0, 700.0}, { 100.0,-500.0, 800.0}, { 100.0,-400.0,-800.0}, { 100.0,-400.0,-700.0}, { 100.0,-400.0,-600.0}, { 100.0,-400.0,-500.0}, { 100.0,-400.0,-400.0}, { 100.0,-400.0,-300.0}, { 100.0,-400.0,-200.0}, { 100.0,-400.0,-100.0}, { 100.0,-400.0, 0.0}, { 100.0,-400.0, 100.0}, { 100.0,-400.0, 200.0}, { 100.0,-400.0, 300.0}, { 100.0,-400.0, 400.0}, { 100.0,-400.0, 500.0}, { 100.0,-400.0, 600.0}, { 100.0,-400.0, 700.0}, { 100.0,-400.0, 800.0}, { 100.0,-300.0,-800.0}, { 100.0,-300.0,-700.0}, { 100.0,-300.0,-600.0}, { 100.0,-300.0,-500.0}, { 100.0,-300.0,-400.0}, { 100.0,-300.0,-300.0}, { 100.0,-300.0,-200.0}, { 100.0,-300.0,-100.0}, { 100.0,-300.0, 0.0}, { 100.0,-300.0, 100.0}, { 100.0,-300.0, 200.0}, { 100.0,-300.0, 300.0}, { 100.0,-300.0, 400.0}, { 100.0,-300.0, 500.0}, { 100.0,-300.0, 600.0}, { 100.0,-300.0, 700.0}, { 100.0,-300.0, 800.0}, { 100.0,-200.0,-800.0}, { 100.0,-200.0,-700.0}, { 100.0,-200.0,-600.0}, { 100.0,-200.0,-500.0}, { 100.0,-200.0,-400.0}, { 100.0,-200.0,-300.0}, { 100.0,-200.0,-200.0}, { 100.0,-200.0,-100.0}, { 100.0,-200.0, 0.0}, { 100.0,-200.0, 100.0}, { 100.0,-200.0, 200.0}, { 100.0,-200.0, 300.0}, { 100.0,-200.0, 400.0}, { 100.0,-200.0, 500.0}, { 100.0,-200.0, 600.0}, { 100.0,-200.0, 700.0}, { 100.0,-200.0, 800.0}, { 100.0,-100.0,-800.0}, { 100.0,-100.0,-700.0}, { 100.0,-100.0,-600.0}, { 100.0,-100.0,-500.0}, { 100.0,-100.0,-400.0}, { 100.0,-100.0,-300.0}, { 100.0,-100.0,-200.0}, { 100.0,-100.0,-100.0}, { 100.0,-100.0, 0.0}, { 100.0,-100.0, 100.0}, { 100.0,-100.0, 200.0}, { 100.0,-100.0, 300.0}, { 100.0,-100.0, 400.0}, { 100.0,-100.0, 500.0}, { 100.0,-100.0, 600.0}, { 100.0,-100.0, 700.0}, { 100.0,-100.0, 800.0}, { 100.0, 0.0,-800.0}, { 100.0, 0.0,-700.0}, { 100.0, 0.0,-600.0}, { 100.0, 0.0,-500.0}, { 100.0, 0.0,-400.0}, { 100.0, 0.0,-300.0}, { 100.0, 0.0,-200.0}, { 100.0, 0.0,-100.0}, { 100.0, 0.0, 0.0}, { 100.0, 0.0, 100.0}, { 100.0, 0.0, 200.0}, { 100.0, 0.0, 300.0}, { 100.0, 0.0, 400.0}, { 100.0, 0.0, 500.0}, { 100.0, 0.0, 600.0}, { 100.0, 0.0, 700.0}, { 100.0, 0.0, 800.0}, { 100.0, 100.0,-800.0}, { 100.0, 100.0,-700.0}, { 100.0, 100.0,-600.0}, { 100.0, 100.0,-500.0}, { 100.0, 100.0,-400.0}, { 100.0, 100.0,-300.0}, { 100.0, 100.0,-200.0}, { 100.0, 100.0,-100.0}, { 100.0, 100.0, 0.0}, { 100.0, 100.0, 100.0}, { 100.0, 100.0, 200.0}, { 100.0, 100.0, 300.0}, { 100.0, 100.0, 400.0}, { 100.0, 100.0, 500.0}, { 100.0, 100.0, 600.0}, { 100.0, 100.0, 700.0}, { 100.0, 100.0, 800.0}, { 100.0, 200.0,-800.0}, { 100.0, 200.0,-700.0}, { 100.0, 200.0,-600.0}, { 100.0, 200.0,-500.0}, { 100.0, 200.0,-400.0}, { 100.0, 200.0,-300.0}, { 100.0, 200.0,-200.0}, { 100.0, 200.0,-100.0}, { 100.0, 200.0, 0.0}, { 100.0, 200.0, 100.0}, { 100.0, 200.0, 200.0}, { 100.0, 200.0, 300.0}, { 100.0, 200.0, 400.0}, { 100.0, 200.0, 500.0}, { 100.0, 200.0, 600.0}, { 100.0, 200.0, 700.0}, { 100.0, 200.0, 800.0}, { 100.0, 300.0,-800.0}, { 100.0, 300.0,-700.0}, { 100.0, 300.0,-600.0}, { 100.0, 300.0,-500.0}, { 100.0, 300.0,-400.0}, { 100.0, 300.0,-300.0}, { 100.0, 300.0,-200.0}, { 100.0, 300.0,-100.0}, { 100.0, 300.0, 0.0}, { 100.0, 300.0, 100.0}, { 100.0, 300.0, 200.0}, { 100.0, 300.0, 300.0}, { 100.0, 300.0, 400.0}, { 100.0, 300.0, 500.0}, { 100.0, 300.0, 600.0}, { 100.0, 300.0, 700.0}, { 100.0, 300.0, 800.0}, { 100.0, 400.0,-800.0}, { 100.0, 400.0,-700.0}, { 100.0, 400.0,-600.0}, { 100.0, 400.0,-500.0}, { 100.0, 400.0,-400.0}, { 100.0, 400.0,-300.0}, { 100.0, 400.0,-200.0}, { 100.0, 400.0,-100.0}, { 100.0, 400.0, 0.0}, { 100.0, 400.0, 100.0}, { 100.0, 400.0, 200.0}, { 100.0, 400.0, 300.0}, { 100.0, 400.0, 400.0}, { 100.0, 400.0, 500.0}, { 100.0, 400.0, 600.0}, { 100.0, 400.0, 700.0}, { 100.0, 400.0, 800.0}, { 100.0, 500.0,-800.0}, { 100.0, 500.0,-700.0}, { 100.0, 500.0,-600.0}, { 100.0, 500.0,-500.0}, { 100.0, 500.0,-400.0}, { 100.0, 500.0,-300.0}, { 100.0, 500.0,-200.0}, { 100.0, 500.0,-100.0}, { 100.0, 500.0, 0.0}, { 100.0, 500.0, 100.0}, { 100.0, 500.0, 200.0}, { 100.0, 500.0, 300.0}, { 100.0, 500.0, 400.0}, { 100.0, 500.0, 500.0}, { 100.0, 500.0, 600.0}, { 100.0, 500.0, 700.0}, { 100.0, 500.0, 800.0}, { 100.0, 600.0,-800.0}, { 100.0, 600.0,-700.0}, { 100.0, 600.0,-600.0}, { 100.0, 600.0,-500.0}, { 100.0, 600.0,-400.0}, { 100.0, 600.0,-300.0}, { 100.0, 600.0,-200.0}, { 100.0, 600.0,-100.0}, { 100.0, 600.0, 0.0}, { 100.0, 600.0, 100.0}, { 100.0, 600.0, 200.0}, { 100.0, 600.0, 300.0}, { 100.0, 600.0, 400.0}, { 100.0, 600.0, 500.0}, { 100.0, 600.0, 600.0}, { 100.0, 600.0, 700.0}, { 100.0, 600.0, 800.0}, { 100.0, 700.0,-800.0}, { 100.0, 700.0,-700.0}, { 100.0, 700.0,-600.0}, { 100.0, 700.0,-500.0}, { 100.0, 700.0,-400.0}, { 100.0, 700.0,-300.0}, { 100.0, 700.0,-200.0}, { 100.0, 700.0,-100.0}, { 100.0, 700.0, 0.0}, { 100.0, 700.0, 100.0}, { 100.0, 700.0, 200.0}, { 100.0, 700.0, 300.0}, { 100.0, 700.0, 400.0}, { 100.0, 700.0, 500.0}, { 100.0, 700.0, 600.0}, { 100.0, 700.0, 700.0}, { 100.0, 700.0, 800.0}, { 100.0, 800.0,-800.0}, { 100.0, 800.0,-700.0}, { 100.0, 800.0,-600.0}, { 100.0, 800.0,-500.0}, { 100.0, 800.0,-400.0}, { 100.0, 800.0,-300.0}, { 100.0, 800.0,-200.0}, { 100.0, 800.0,-100.0}, { 100.0, 800.0, 0.0}, { 100.0, 800.0, 100.0}, { 100.0, 800.0, 200.0}, { 100.0, 800.0, 300.0}, { 100.0, 800.0, 400.0}, { 100.0, 800.0, 500.0}, { 100.0, 800.0, 600.0}, { 100.0, 800.0, 700.0}, { 100.0, 800.0, 800.0}, { 200.0,-800.0,-800.0}, { 200.0,-800.0,-700.0}, { 200.0,-800.0,-600.0}, { 200.0,-800.0,-500.0}, { 200.0,-800.0,-400.0}, { 200.0,-800.0,-300.0}, { 200.0,-800.0,-200.0}, { 200.0,-800.0,-100.0}, { 200.0,-800.0, 0.0}, { 200.0,-800.0, 100.0}, { 200.0,-800.0, 200.0}, { 200.0,-800.0, 300.0}, { 200.0,-800.0, 400.0}, { 200.0,-800.0, 500.0}, { 200.0,-800.0, 600.0}, { 200.0,-800.0, 700.0}, { 200.0,-800.0, 800.0}, { 200.0,-700.0,-800.0}, { 200.0,-700.0,-700.0}, { 200.0,-700.0,-600.0}, { 200.0,-700.0,-500.0}, { 200.0,-700.0,-400.0}, { 200.0,-700.0,-300.0}, { 200.0,-700.0,-200.0}, { 200.0,-700.0,-100.0}, { 200.0,-700.0, 0.0}, { 200.0,-700.0, 100.0}, { 200.0,-700.0, 200.0}, { 200.0,-700.0, 300.0}, { 200.0,-700.0, 400.0}, { 200.0,-700.0, 500.0}, { 200.0,-700.0, 600.0}, { 200.0,-700.0, 700.0}, { 200.0,-700.0, 800.0}, { 200.0,-600.0,-800.0}, { 200.0,-600.0,-700.0}, { 200.0,-600.0,-600.0}, { 200.0,-600.0,-500.0}, { 200.0,-600.0,-400.0}, { 200.0,-600.0,-300.0}, { 200.0,-600.0,-200.0}, { 200.0,-600.0,-100.0}, { 200.0,-600.0, 0.0}, { 200.0,-600.0, 100.0}, { 200.0,-600.0, 200.0}, { 200.0,-600.0, 300.0}, { 200.0,-600.0, 400.0}, { 200.0,-600.0, 500.0}, { 200.0,-600.0, 600.0}, { 200.0,-600.0, 700.0}, { 200.0,-600.0, 800.0}, { 200.0,-500.0,-800.0}, { 200.0,-500.0,-700.0}, { 200.0,-500.0,-600.0}, { 200.0,-500.0,-500.0}, { 200.0,-500.0,-400.0}, { 200.0,-500.0,-300.0}, { 200.0,-500.0,-200.0}, { 200.0,-500.0,-100.0}, { 200.0,-500.0, 0.0}, { 200.0,-500.0, 100.0}, { 200.0,-500.0, 200.0}, { 200.0,-500.0, 300.0}, { 200.0,-500.0, 400.0}, { 200.0,-500.0, 500.0}, { 200.0,-500.0, 600.0}, { 200.0,-500.0, 700.0}, { 200.0,-500.0, 800.0}, { 200.0,-400.0,-800.0}, { 200.0,-400.0,-700.0}, { 200.0,-400.0,-600.0}, { 200.0,-400.0,-500.0}, { 200.0,-400.0,-400.0}, { 200.0,-400.0,-300.0}, { 200.0,-400.0,-200.0}, { 200.0,-400.0,-100.0}, { 200.0,-400.0, 0.0}, { 200.0,-400.0, 100.0}, { 200.0,-400.0, 200.0}, { 200.0,-400.0, 300.0}, { 200.0,-400.0, 400.0}, { 200.0,-400.0, 500.0}, { 200.0,-400.0, 600.0}, { 200.0,-400.0, 700.0}, { 200.0,-400.0, 800.0}, { 200.0,-300.0,-800.0}, { 200.0,-300.0,-700.0}, { 200.0,-300.0,-600.0}, { 200.0,-300.0,-500.0}, { 200.0,-300.0,-400.0}, { 200.0,-300.0,-300.0}, { 200.0,-300.0,-200.0}, { 200.0,-300.0,-100.0}, { 200.0,-300.0, 0.0}, { 200.0,-300.0, 100.0}, { 200.0,-300.0, 200.0}, { 200.0,-300.0, 300.0}, { 200.0,-300.0, 400.0}, { 200.0,-300.0, 500.0}, { 200.0,-300.0, 600.0}, { 200.0,-300.0, 700.0}, { 200.0,-300.0, 800.0}, { 200.0,-200.0,-800.0}, { 200.0,-200.0,-700.0}, { 200.0,-200.0,-600.0}, { 200.0,-200.0,-500.0}, { 200.0,-200.0,-400.0}, { 200.0,-200.0,-300.0}, { 200.0,-200.0,-200.0}, { 200.0,-200.0,-100.0}, { 200.0,-200.0, 0.0}, { 200.0,-200.0, 100.0}, { 200.0,-200.0, 200.0}, { 200.0,-200.0, 300.0}, { 200.0,-200.0, 400.0}, { 200.0,-200.0, 500.0}, { 200.0,-200.0, 600.0}, { 200.0,-200.0, 700.0}, { 200.0,-200.0, 800.0}, { 200.0,-100.0,-800.0}, { 200.0,-100.0,-700.0}, { 200.0,-100.0,-600.0}, { 200.0,-100.0,-500.0}, { 200.0,-100.0,-400.0}, { 200.0,-100.0,-300.0}, { 200.0,-100.0,-200.0}, { 200.0,-100.0,-100.0}, { 200.0,-100.0, 0.0}, { 200.0,-100.0, 100.0}, { 200.0,-100.0, 200.0}, { 200.0,-100.0, 300.0}, { 200.0,-100.0, 400.0}, { 200.0,-100.0, 500.0}, { 200.0,-100.0, 600.0}, { 200.0,-100.0, 700.0}, { 200.0,-100.0, 800.0}, { 200.0, 0.0,-800.0}, { 200.0, 0.0,-700.0}, { 200.0, 0.0,-600.0}, { 200.0, 0.0,-500.0}, { 200.0, 0.0,-400.0}, { 200.0, 0.0,-300.0}, { 200.0, 0.0,-200.0}, { 200.0, 0.0,-100.0}, { 200.0, 0.0, 0.0}, { 200.0, 0.0, 100.0}, { 200.0, 0.0, 200.0}, { 200.0, 0.0, 300.0}, { 200.0, 0.0, 400.0}, { 200.0, 0.0, 500.0}, { 200.0, 0.0, 600.0}, { 200.0, 0.0, 700.0}, { 200.0, 0.0, 800.0}, { 200.0, 100.0,-800.0}, { 200.0, 100.0,-700.0}, { 200.0, 100.0,-600.0}, { 200.0, 100.0,-500.0}, { 200.0, 100.0,-400.0}, { 200.0, 100.0,-300.0}, { 200.0, 100.0,-200.0}, { 200.0, 100.0,-100.0}, { 200.0, 100.0, 0.0}, { 200.0, 100.0, 100.0}, { 200.0, 100.0, 200.0}, { 200.0, 100.0, 300.0}, { 200.0, 100.0, 400.0}, { 200.0, 100.0, 500.0}, { 200.0, 100.0, 600.0}, { 200.0, 100.0, 700.0}, { 200.0, 100.0, 800.0}, { 200.0, 200.0,-800.0}, { 200.0, 200.0,-700.0}, { 200.0, 200.0,-600.0}, { 200.0, 200.0,-500.0}, { 200.0, 200.0,-400.0}, { 200.0, 200.0,-300.0}, { 200.0, 200.0,-200.0}, { 200.0, 200.0,-100.0}, { 200.0, 200.0, 0.0}, { 200.0, 200.0, 100.0}, { 200.0, 200.0, 200.0}, { 200.0, 200.0, 300.0}, { 200.0, 200.0, 400.0}, { 200.0, 200.0, 500.0}, { 200.0, 200.0, 600.0}, { 200.0, 200.0, 700.0}, { 200.0, 200.0, 800.0}, { 200.0, 300.0,-800.0}, { 200.0, 300.0,-700.0}, { 200.0, 300.0,-600.0}, { 200.0, 300.0,-500.0}, { 200.0, 300.0,-400.0}, { 200.0, 300.0,-300.0}, { 200.0, 300.0,-200.0}, { 200.0, 300.0,-100.0}, { 200.0, 300.0, 0.0}, { 200.0, 300.0, 100.0}, { 200.0, 300.0, 200.0}, { 200.0, 300.0, 300.0}, { 200.0, 300.0, 400.0}, { 200.0, 300.0, 500.0}, { 200.0, 300.0, 600.0}, { 200.0, 300.0, 700.0}, { 200.0, 300.0, 800.0}, { 200.0, 400.0,-800.0}, { 200.0, 400.0,-700.0}, { 200.0, 400.0,-600.0}, { 200.0, 400.0,-500.0}, { 200.0, 400.0,-400.0}, { 200.0, 400.0,-300.0}, { 200.0, 400.0,-200.0}, { 200.0, 400.0,-100.0}, { 200.0, 400.0, 0.0}, { 200.0, 400.0, 100.0}, { 200.0, 400.0, 200.0}, { 200.0, 400.0, 300.0}, { 200.0, 400.0, 400.0}, { 200.0, 400.0, 500.0}, { 200.0, 400.0, 600.0}, { 200.0, 400.0, 700.0}, { 200.0, 400.0, 800.0}, { 200.0, 500.0,-800.0}, { 200.0, 500.0,-700.0}, { 200.0, 500.0,-600.0}, { 200.0, 500.0,-500.0}, { 200.0, 500.0,-400.0}, { 200.0, 500.0,-300.0}, { 200.0, 500.0,-200.0}, { 200.0, 500.0,-100.0}, { 200.0, 500.0, 0.0}, { 200.0, 500.0, 100.0}, { 200.0, 500.0, 200.0}, { 200.0, 500.0, 300.0}, { 200.0, 500.0, 400.0}, { 200.0, 500.0, 500.0}, { 200.0, 500.0, 600.0}, { 200.0, 500.0, 700.0}, { 200.0, 500.0, 800.0}, { 200.0, 600.0,-800.0}, { 200.0, 600.0,-700.0}, { 200.0, 600.0,-600.0}, { 200.0, 600.0,-500.0}, { 200.0, 600.0,-400.0}, { 200.0, 600.0,-300.0}, { 200.0, 600.0,-200.0}, { 200.0, 600.0,-100.0}, { 200.0, 600.0, 0.0}, { 200.0, 600.0, 100.0}, { 200.0, 600.0, 200.0}, { 200.0, 600.0, 300.0}, { 200.0, 600.0, 400.0}, { 200.0, 600.0, 500.0}, { 200.0, 600.0, 600.0}, { 200.0, 600.0, 700.0}, { 200.0, 600.0, 800.0}, { 200.0, 700.0,-800.0}, { 200.0, 700.0,-700.0}, { 200.0, 700.0,-600.0}, { 200.0, 700.0,-500.0}, { 200.0, 700.0,-400.0}, { 200.0, 700.0,-300.0}, { 200.0, 700.0,-200.0}, { 200.0, 700.0,-100.0}, { 200.0, 700.0, 0.0}, { 200.0, 700.0, 100.0}, { 200.0, 700.0, 200.0}, { 200.0, 700.0, 300.0}, { 200.0, 700.0, 400.0}, { 200.0, 700.0, 500.0}, { 200.0, 700.0, 600.0}, { 200.0, 700.0, 700.0}, { 200.0, 700.0, 800.0}, { 200.0, 800.0,-800.0}, { 200.0, 800.0,-700.0}, { 200.0, 800.0,-600.0}, { 200.0, 800.0,-500.0}, { 200.0, 800.0,-400.0}, { 200.0, 800.0,-300.0}, { 200.0, 800.0,-200.0}, { 200.0, 800.0,-100.0}, { 200.0, 800.0, 0.0}, { 200.0, 800.0, 100.0}, { 200.0, 800.0, 200.0}, { 200.0, 800.0, 300.0}, { 200.0, 800.0, 400.0}, { 200.0, 800.0, 500.0}, { 200.0, 800.0, 600.0}, { 200.0, 800.0, 700.0}, { 200.0, 800.0, 800.0}, { 300.0,-800.0,-800.0}, { 300.0,-800.0,-700.0}, { 300.0,-800.0,-600.0}, { 300.0,-800.0,-500.0}, { 300.0,-800.0,-400.0}, { 300.0,-800.0,-300.0}, { 300.0,-800.0,-200.0}, { 300.0,-800.0,-100.0}, { 300.0,-800.0, 0.0}, { 300.0,-800.0, 100.0}, { 300.0,-800.0, 200.0}, { 300.0,-800.0, 300.0}, { 300.0,-800.0, 400.0}, { 300.0,-800.0, 500.0}, { 300.0,-800.0, 600.0}, { 300.0,-800.0, 700.0}, { 300.0,-800.0, 800.0}, { 300.0,-700.0,-800.0}, { 300.0,-700.0,-700.0}, { 300.0,-700.0,-600.0}, { 300.0,-700.0,-500.0}, { 300.0,-700.0,-400.0}, { 300.0,-700.0,-300.0}, { 300.0,-700.0,-200.0}, { 300.0,-700.0,-100.0}, { 300.0,-700.0, 0.0}, { 300.0,-700.0, 100.0}, { 300.0,-700.0, 200.0}, { 300.0,-700.0, 300.0}, { 300.0,-700.0, 400.0}, { 300.0,-700.0, 500.0}, { 300.0,-700.0, 600.0}, { 300.0,-700.0, 700.0}, { 300.0,-700.0, 800.0}, { 300.0,-600.0,-800.0}, { 300.0,-600.0,-700.0}, { 300.0,-600.0,-600.0}, { 300.0,-600.0,-500.0}, { 300.0,-600.0,-400.0}, { 300.0,-600.0,-300.0}, { 300.0,-600.0,-200.0}, { 300.0,-600.0,-100.0}, { 300.0,-600.0, 0.0}, { 300.0,-600.0, 100.0}, { 300.0,-600.0, 200.0}, { 300.0,-600.0, 300.0}, { 300.0,-600.0, 400.0}, { 300.0,-600.0, 500.0}, { 300.0,-600.0, 600.0}, { 300.0,-600.0, 700.0}, { 300.0,-600.0, 800.0}, { 300.0,-500.0,-800.0}, { 300.0,-500.0,-700.0}, { 300.0,-500.0,-600.0}, { 300.0,-500.0,-500.0}, { 300.0,-500.0,-400.0}, { 300.0,-500.0,-300.0}, { 300.0,-500.0,-200.0}, { 300.0,-500.0,-100.0}, { 300.0,-500.0, 0.0}, { 300.0,-500.0, 100.0}, { 300.0,-500.0, 200.0}, { 300.0,-500.0, 300.0}, { 300.0,-500.0, 400.0}, { 300.0,-500.0, 500.0}, { 300.0,-500.0, 600.0}, { 300.0,-500.0, 700.0}, { 300.0,-500.0, 800.0}, { 300.0,-400.0,-800.0}, { 300.0,-400.0,-700.0}, { 300.0,-400.0,-600.0}, { 300.0,-400.0,-500.0}, { 300.0,-400.0,-400.0}, { 300.0,-400.0,-300.0}, { 300.0,-400.0,-200.0}, { 300.0,-400.0,-100.0}, { 300.0,-400.0, 0.0}, { 300.0,-400.0, 100.0}, { 300.0,-400.0, 200.0}, { 300.0,-400.0, 300.0}, { 300.0,-400.0, 400.0}, { 300.0,-400.0, 500.0}, { 300.0,-400.0, 600.0}, { 300.0,-400.0, 700.0}, { 300.0,-400.0, 800.0}, { 300.0,-300.0,-800.0}, { 300.0,-300.0,-700.0}, { 300.0,-300.0,-600.0}, { 300.0,-300.0,-500.0}, { 300.0,-300.0,-400.0}, { 300.0,-300.0,-300.0}, { 300.0,-300.0,-200.0}, { 300.0,-300.0,-100.0}, { 300.0,-300.0, 0.0}, { 300.0,-300.0, 100.0}, { 300.0,-300.0, 200.0}, { 300.0,-300.0, 300.0}, { 300.0,-300.0, 400.0}, { 300.0,-300.0, 500.0}, { 300.0,-300.0, 600.0}, { 300.0,-300.0, 700.0}, { 300.0,-300.0, 800.0}, { 300.0,-200.0,-800.0}, { 300.0,-200.0,-700.0}, { 300.0,-200.0,-600.0}, { 300.0,-200.0,-500.0}, { 300.0,-200.0,-400.0}, { 300.0,-200.0,-300.0}, { 300.0,-200.0,-200.0}, { 300.0,-200.0,-100.0}, { 300.0,-200.0, 0.0}, { 300.0,-200.0, 100.0}, { 300.0,-200.0, 200.0}, { 300.0,-200.0, 300.0}, { 300.0,-200.0, 400.0}, { 300.0,-200.0, 500.0}, { 300.0,-200.0, 600.0}, { 300.0,-200.0, 700.0}, { 300.0,-200.0, 800.0}, { 300.0,-100.0,-800.0}, { 300.0,-100.0,-700.0}, { 300.0,-100.0,-600.0}, { 300.0,-100.0,-500.0}, { 300.0,-100.0,-400.0}, { 300.0,-100.0,-300.0}, { 300.0,-100.0,-200.0}, { 300.0,-100.0,-100.0}, { 300.0,-100.0, 0.0}, { 300.0,-100.0, 100.0}, { 300.0,-100.0, 200.0}, { 300.0,-100.0, 300.0}, { 300.0,-100.0, 400.0}, { 300.0,-100.0, 500.0}, { 300.0,-100.0, 600.0}, { 300.0,-100.0, 700.0}, { 300.0,-100.0, 800.0}, { 300.0, 0.0,-800.0}, { 300.0, 0.0,-700.0}, { 300.0, 0.0,-600.0}, { 300.0, 0.0,-500.0}, { 300.0, 0.0,-400.0}, { 300.0, 0.0,-300.0}, { 300.0, 0.0,-200.0}, { 300.0, 0.0,-100.0}, { 300.0, 0.0, 0.0}, { 300.0, 0.0, 100.0}, { 300.0, 0.0, 200.0}, { 300.0, 0.0, 300.0}, { 300.0, 0.0, 400.0}, { 300.0, 0.0, 500.0}, { 300.0, 0.0, 600.0}, { 300.0, 0.0, 700.0}, { 300.0, 0.0, 800.0}, { 300.0, 100.0,-800.0}, { 300.0, 100.0,-700.0}, { 300.0, 100.0,-600.0}, { 300.0, 100.0,-500.0}, { 300.0, 100.0,-400.0}, { 300.0, 100.0,-300.0}, { 300.0, 100.0,-200.0}, { 300.0, 100.0,-100.0}, { 300.0, 100.0, 0.0}, { 300.0, 100.0, 100.0}, { 300.0, 100.0, 200.0}, { 300.0, 100.0, 300.0}, { 300.0, 100.0, 400.0}, { 300.0, 100.0, 500.0}, { 300.0, 100.0, 600.0}, { 300.0, 100.0, 700.0}, { 300.0, 100.0, 800.0}, { 300.0, 200.0,-800.0}, { 300.0, 200.0,-700.0}, { 300.0, 200.0,-600.0}, { 300.0, 200.0,-500.0}, { 300.0, 200.0,-400.0}, { 300.0, 200.0,-300.0}, { 300.0, 200.0,-200.0}, { 300.0, 200.0,-100.0}, { 300.0, 200.0, 0.0}, { 300.0, 200.0, 100.0}, { 300.0, 200.0, 200.0}, { 300.0, 200.0, 300.0}, { 300.0, 200.0, 400.0}, { 300.0, 200.0, 500.0}, { 300.0, 200.0, 600.0}, { 300.0, 200.0, 700.0}, { 300.0, 200.0, 800.0}, { 300.0, 300.0,-800.0}, { 300.0, 300.0,-700.0}, { 300.0, 300.0,-600.0}, { 300.0, 300.0,-500.0}, { 300.0, 300.0,-400.0}, { 300.0, 300.0,-300.0}, { 300.0, 300.0,-200.0}, { 300.0, 300.0,-100.0}, { 300.0, 300.0, 0.0}, { 300.0, 300.0, 100.0}, { 300.0, 300.0, 200.0}, { 300.0, 300.0, 300.0}, { 300.0, 300.0, 400.0}, { 300.0, 300.0, 500.0}, { 300.0, 300.0, 600.0}, { 300.0, 300.0, 700.0}, { 300.0, 300.0, 800.0}, { 300.0, 400.0,-800.0}, { 300.0, 400.0,-700.0}, { 300.0, 400.0,-600.0}, { 300.0, 400.0,-500.0}, { 300.0, 400.0,-400.0}, { 300.0, 400.0,-300.0}, { 300.0, 400.0,-200.0}, { 300.0, 400.0,-100.0}, { 300.0, 400.0, 0.0}, { 300.0, 400.0, 100.0}, { 300.0, 400.0, 200.0}, { 300.0, 400.0, 300.0}, { 300.0, 400.0, 400.0}, { 300.0, 400.0, 500.0}, { 300.0, 400.0, 600.0}, { 300.0, 400.0, 700.0}, { 300.0, 400.0, 800.0}, { 300.0, 500.0,-800.0}, { 300.0, 500.0,-700.0}, { 300.0, 500.0,-600.0}, { 300.0, 500.0,-500.0}, { 300.0, 500.0,-400.0}, { 300.0, 500.0,-300.0}, { 300.0, 500.0,-200.0}, { 300.0, 500.0,-100.0}, { 300.0, 500.0, 0.0}, { 300.0, 500.0, 100.0}, { 300.0, 500.0, 200.0}, { 300.0, 500.0, 300.0}, { 300.0, 500.0, 400.0}, { 300.0, 500.0, 500.0}, { 300.0, 500.0, 600.0}, { 300.0, 500.0, 700.0}, { 300.0, 500.0, 800.0}, { 300.0, 600.0,-800.0}, { 300.0, 600.0,-700.0}, { 300.0, 600.0,-600.0}, { 300.0, 600.0,-500.0}, { 300.0, 600.0,-400.0}, { 300.0, 600.0,-300.0}, { 300.0, 600.0,-200.0}, { 300.0, 600.0,-100.0}, { 300.0, 600.0, 0.0}, { 300.0, 600.0, 100.0}, { 300.0, 600.0, 200.0}, { 300.0, 600.0, 300.0}, { 300.0, 600.0, 400.0}, { 300.0, 600.0, 500.0}, { 300.0, 600.0, 600.0}, { 300.0, 600.0, 700.0}, { 300.0, 600.0, 800.0}, { 300.0, 700.0,-800.0}, { 300.0, 700.0,-700.0}, { 300.0, 700.0,-600.0}, { 300.0, 700.0,-500.0}, { 300.0, 700.0,-400.0}, { 300.0, 700.0,-300.0}, { 300.0, 700.0,-200.0}, { 300.0, 700.0,-100.0}, { 300.0, 700.0, 0.0}, { 300.0, 700.0, 100.0}, { 300.0, 700.0, 200.0}, { 300.0, 700.0, 300.0}, { 300.0, 700.0, 400.0}, { 300.0, 700.0, 500.0}, { 300.0, 700.0, 600.0}, { 300.0, 700.0, 700.0}, { 300.0, 700.0, 800.0}, { 300.0, 800.0,-800.0}, { 300.0, 800.0,-700.0}, { 300.0, 800.0,-600.0}, { 300.0, 800.0,-500.0}, { 300.0, 800.0,-400.0}, { 300.0, 800.0,-300.0}, { 300.0, 800.0,-200.0}, { 300.0, 800.0,-100.0}, { 300.0, 800.0, 0.0}, { 300.0, 800.0, 100.0}, { 300.0, 800.0, 200.0}, { 300.0, 800.0, 300.0}, { 300.0, 800.0, 400.0}, { 300.0, 800.0, 500.0}, { 300.0, 800.0, 600.0}, { 300.0, 800.0, 700.0}, { 300.0, 800.0, 800.0}, { 400.0,-800.0,-800.0}, { 400.0,-800.0,-700.0}, { 400.0,-800.0,-600.0}, { 400.0,-800.0,-500.0}, { 400.0,-800.0,-400.0}, { 400.0,-800.0,-300.0}, { 400.0,-800.0,-200.0}, { 400.0,-800.0,-100.0}, { 400.0,-800.0, 0.0}, { 400.0,-800.0, 100.0}, { 400.0,-800.0, 200.0}, { 400.0,-800.0, 300.0}, { 400.0,-800.0, 400.0}, { 400.0,-800.0, 500.0}, { 400.0,-800.0, 600.0}, { 400.0,-800.0, 700.0}, { 400.0,-800.0, 800.0}, { 400.0,-700.0,-800.0}, { 400.0,-700.0,-700.0}, { 400.0,-700.0,-600.0}, { 400.0,-700.0,-500.0}, { 400.0,-700.0,-400.0}, { 400.0,-700.0,-300.0}, { 400.0,-700.0,-200.0}, { 400.0,-700.0,-100.0}, { 400.0,-700.0, 0.0}, { 400.0,-700.0, 100.0}, { 400.0,-700.0, 200.0}, { 400.0,-700.0, 300.0}, { 400.0,-700.0, 400.0}, { 400.0,-700.0, 500.0}, { 400.0,-700.0, 600.0}, { 400.0,-700.0, 700.0}, { 400.0,-700.0, 800.0}, { 400.0,-600.0,-800.0}, { 400.0,-600.0,-700.0}, { 400.0,-600.0,-600.0}, { 400.0,-600.0,-500.0}, { 400.0,-600.0,-400.0}, { 400.0,-600.0,-300.0}, { 400.0,-600.0,-200.0}, { 400.0,-600.0,-100.0}, { 400.0,-600.0, 0.0}, { 400.0,-600.0, 100.0}, { 400.0,-600.0, 200.0}, { 400.0,-600.0, 300.0}, { 400.0,-600.0, 400.0}, { 400.0,-600.0, 500.0}, { 400.0,-600.0, 600.0}, { 400.0,-600.0, 700.0}, { 400.0,-600.0, 800.0}, { 400.0,-500.0,-800.0}, { 400.0,-500.0,-700.0}, { 400.0,-500.0,-600.0}, { 400.0,-500.0,-500.0}, { 400.0,-500.0,-400.0}, { 400.0,-500.0,-300.0}, { 400.0,-500.0,-200.0}, { 400.0,-500.0,-100.0}, { 400.0,-500.0, 0.0}, { 400.0,-500.0, 100.0}, { 400.0,-500.0, 200.0}, { 400.0,-500.0, 300.0}, { 400.0,-500.0, 400.0}, { 400.0,-500.0, 500.0}, { 400.0,-500.0, 600.0}, { 400.0,-500.0, 700.0}, { 400.0,-500.0, 800.0}, { 400.0,-400.0,-800.0}, { 400.0,-400.0,-700.0}, { 400.0,-400.0,-600.0}, { 400.0,-400.0,-500.0}, { 400.0,-400.0,-400.0}, { 400.0,-400.0,-300.0}, { 400.0,-400.0,-200.0}, { 400.0,-400.0,-100.0}, { 400.0,-400.0, 0.0}, { 400.0,-400.0, 100.0}, { 400.0,-400.0, 200.0}, { 400.0,-400.0, 300.0}, { 400.0,-400.0, 400.0}, { 400.0,-400.0, 500.0}, { 400.0,-400.0, 600.0}, { 400.0,-400.0, 700.0}, { 400.0,-400.0, 800.0}, { 400.0,-300.0,-800.0}, { 400.0,-300.0,-700.0}, { 400.0,-300.0,-600.0}, { 400.0,-300.0,-500.0}, { 400.0,-300.0,-400.0}, { 400.0,-300.0,-300.0}, { 400.0,-300.0,-200.0}, { 400.0,-300.0,-100.0}, { 400.0,-300.0, 0.0}, { 400.0,-300.0, 100.0}, { 400.0,-300.0, 200.0}, { 400.0,-300.0, 300.0}, { 400.0,-300.0, 400.0}, { 400.0,-300.0, 500.0}, { 400.0,-300.0, 600.0}, { 400.0,-300.0, 700.0}, { 400.0,-300.0, 800.0}, { 400.0,-200.0,-800.0}, { 400.0,-200.0,-700.0}, { 400.0,-200.0,-600.0}, { 400.0,-200.0,-500.0}, { 400.0,-200.0,-400.0}, { 400.0,-200.0,-300.0}, { 400.0,-200.0,-200.0}, { 400.0,-200.0,-100.0}, { 400.0,-200.0, 0.0}, { 400.0,-200.0, 100.0}, { 400.0,-200.0, 200.0}, { 400.0,-200.0, 300.0}, { 400.0,-200.0, 400.0}, { 400.0,-200.0, 500.0}, { 400.0,-200.0, 600.0}, { 400.0,-200.0, 700.0}, { 400.0,-200.0, 800.0}, { 400.0,-100.0,-800.0}, { 400.0,-100.0,-700.0}, { 400.0,-100.0,-600.0}, { 400.0,-100.0,-500.0}, { 400.0,-100.0,-400.0}, { 400.0,-100.0,-300.0}, { 400.0,-100.0,-200.0}, { 400.0,-100.0,-100.0}, { 400.0,-100.0, 0.0}, { 400.0,-100.0, 100.0}, { 400.0,-100.0, 200.0}, { 400.0,-100.0, 300.0}, { 400.0,-100.0, 400.0}, { 400.0,-100.0, 500.0}, { 400.0,-100.0, 600.0}, { 400.0,-100.0, 700.0}, { 400.0,-100.0, 800.0}, { 400.0, 0.0,-800.0}, { 400.0, 0.0,-700.0}, { 400.0, 0.0,-600.0}, { 400.0, 0.0,-500.0}, { 400.0, 0.0,-400.0}, { 400.0, 0.0,-300.0}, { 400.0, 0.0,-200.0}, { 400.0, 0.0,-100.0}, { 400.0, 0.0, 0.0}, { 400.0, 0.0, 100.0}, { 400.0, 0.0, 200.0}, { 400.0, 0.0, 300.0}, { 400.0, 0.0, 400.0}, { 400.0, 0.0, 500.0}, { 400.0, 0.0, 600.0}, { 400.0, 0.0, 700.0}, { 400.0, 0.0, 800.0}, { 400.0, 100.0,-800.0}, { 400.0, 100.0,-700.0}, { 400.0, 100.0,-600.0}, { 400.0, 100.0,-500.0}, { 400.0, 100.0,-400.0}, { 400.0, 100.0,-300.0}, { 400.0, 100.0,-200.0}, { 400.0, 100.0,-100.0}, { 400.0, 100.0, 0.0}, { 400.0, 100.0, 100.0}, { 400.0, 100.0, 200.0}, { 400.0, 100.0, 300.0}, { 400.0, 100.0, 400.0}, { 400.0, 100.0, 500.0}, { 400.0, 100.0, 600.0}, { 400.0, 100.0, 700.0}, { 400.0, 100.0, 800.0}, { 400.0, 200.0,-800.0}, { 400.0, 200.0,-700.0}, { 400.0, 200.0,-600.0}, { 400.0, 200.0,-500.0}, { 400.0, 200.0,-400.0}, { 400.0, 200.0,-300.0}, { 400.0, 200.0,-200.0}, { 400.0, 200.0,-100.0}, { 400.0, 200.0, 0.0}, { 400.0, 200.0, 100.0}, { 400.0, 200.0, 200.0}, { 400.0, 200.0, 300.0}, { 400.0, 200.0, 400.0}, { 400.0, 200.0, 500.0}, { 400.0, 200.0, 600.0}, { 400.0, 200.0, 700.0}, { 400.0, 200.0, 800.0}, { 400.0, 300.0,-800.0}, { 400.0, 300.0,-700.0}, { 400.0, 300.0,-600.0}, { 400.0, 300.0,-500.0}, { 400.0, 300.0,-400.0}, { 400.0, 300.0,-300.0}, { 400.0, 300.0,-200.0}, { 400.0, 300.0,-100.0}, { 400.0, 300.0, 0.0}, { 400.0, 300.0, 100.0}, { 400.0, 300.0, 200.0}, { 400.0, 300.0, 300.0}, { 400.0, 300.0, 400.0}, { 400.0, 300.0, 500.0}, { 400.0, 300.0, 600.0}, { 400.0, 300.0, 700.0}, { 400.0, 300.0, 800.0}, { 400.0, 400.0,-800.0}, { 400.0, 400.0,-700.0}, { 400.0, 400.0,-600.0}, { 400.0, 400.0,-500.0}, { 400.0, 400.0,-400.0}, { 400.0, 400.0,-300.0}, { 400.0, 400.0,-200.0}, { 400.0, 400.0,-100.0}, { 400.0, 400.0, 0.0}, { 400.0, 400.0, 100.0}, { 400.0, 400.0, 200.0}, { 400.0, 400.0, 300.0}, { 400.0, 400.0, 400.0}, { 400.0, 400.0, 500.0}, { 400.0, 400.0, 600.0}, { 400.0, 400.0, 700.0}, { 400.0, 400.0, 800.0}, { 400.0, 500.0,-800.0}, { 400.0, 500.0,-700.0}, { 400.0, 500.0,-600.0}, { 400.0, 500.0,-500.0}, { 400.0, 500.0,-400.0}, { 400.0, 500.0,-300.0}, { 400.0, 500.0,-200.0}, { 400.0, 500.0,-100.0}, { 400.0, 500.0, 0.0}, { 400.0, 500.0, 100.0}, { 400.0, 500.0, 200.0}, { 400.0, 500.0, 300.0}, { 400.0, 500.0, 400.0}, { 400.0, 500.0, 500.0}, { 400.0, 500.0, 600.0}, { 400.0, 500.0, 700.0}, { 400.0, 500.0, 800.0}, { 400.0, 600.0,-800.0}, { 400.0, 600.0,-700.0}, { 400.0, 600.0,-600.0}, { 400.0, 600.0,-500.0}, { 400.0, 600.0,-400.0}, { 400.0, 600.0,-300.0}, { 400.0, 600.0,-200.0}, { 400.0, 600.0,-100.0}, { 400.0, 600.0, 0.0}, { 400.0, 600.0, 100.0}, { 400.0, 600.0, 200.0}, { 400.0, 600.0, 300.0}, { 400.0, 600.0, 400.0}, { 400.0, 600.0, 500.0}, { 400.0, 600.0, 600.0}, { 400.0, 600.0, 700.0}, { 400.0, 600.0, 800.0}, { 400.0, 700.0,-800.0}, { 400.0, 700.0,-700.0}, { 400.0, 700.0,-600.0}, { 400.0, 700.0,-500.0}, { 400.0, 700.0,-400.0}, { 400.0, 700.0,-300.0}, { 400.0, 700.0,-200.0}, { 400.0, 700.0,-100.0}, { 400.0, 700.0, 0.0}, { 400.0, 700.0, 100.0}, { 400.0, 700.0, 200.0}, { 400.0, 700.0, 300.0}, { 400.0, 700.0, 400.0}, { 400.0, 700.0, 500.0}, { 400.0, 700.0, 600.0}, { 400.0, 700.0, 700.0}, { 400.0, 700.0, 800.0}, { 400.0, 800.0,-800.0}, { 400.0, 800.0,-700.0}, { 400.0, 800.0,-600.0}, { 400.0, 800.0,-500.0}, { 400.0, 800.0,-400.0}, { 400.0, 800.0,-300.0}, { 400.0, 800.0,-200.0}, { 400.0, 800.0,-100.0}, { 400.0, 800.0, 0.0}, { 400.0, 800.0, 100.0}, { 400.0, 800.0, 200.0}, { 400.0, 800.0, 300.0}, { 400.0, 800.0, 400.0}, { 400.0, 800.0, 500.0}, { 400.0, 800.0, 600.0}, { 400.0, 800.0, 700.0}, { 400.0, 800.0, 800.0}, { 500.0,-800.0,-800.0}, { 500.0,-800.0,-700.0}, { 500.0,-800.0,-600.0}, { 500.0,-800.0,-500.0}, { 500.0,-800.0,-400.0}, { 500.0,-800.0,-300.0}, { 500.0,-800.0,-200.0}, { 500.0,-800.0,-100.0}, { 500.0,-800.0, 0.0}, { 500.0,-800.0, 100.0}, { 500.0,-800.0, 200.0}, { 500.0,-800.0, 300.0}, { 500.0,-800.0, 400.0}, { 500.0,-800.0, 500.0}, { 500.0,-800.0, 600.0}, { 500.0,-800.0, 700.0}, { 500.0,-800.0, 800.0}, { 500.0,-700.0,-800.0}, { 500.0,-700.0,-700.0}, { 500.0,-700.0,-600.0}, { 500.0,-700.0,-500.0}, { 500.0,-700.0,-400.0}, { 500.0,-700.0,-300.0}, { 500.0,-700.0,-200.0}, { 500.0,-700.0,-100.0}, { 500.0,-700.0, 0.0}, { 500.0,-700.0, 100.0}, { 500.0,-700.0, 200.0}, { 500.0,-700.0, 300.0}, { 500.0,-700.0, 400.0}, { 500.0,-700.0, 500.0}, { 500.0,-700.0, 600.0}, { 500.0,-700.0, 700.0}, { 500.0,-700.0, 800.0}, { 500.0,-600.0,-800.0}, { 500.0,-600.0,-700.0}, { 500.0,-600.0,-600.0}, { 500.0,-600.0,-500.0}, { 500.0,-600.0,-400.0}, { 500.0,-600.0,-300.0}, { 500.0,-600.0,-200.0}, { 500.0,-600.0,-100.0}, { 500.0,-600.0, 0.0}, { 500.0,-600.0, 100.0}, { 500.0,-600.0, 200.0}, { 500.0,-600.0, 300.0}, { 500.0,-600.0, 400.0}, { 500.0,-600.0, 500.0}, { 500.0,-600.0, 600.0}, { 500.0,-600.0, 700.0}, { 500.0,-600.0, 800.0}, { 500.0,-500.0,-800.0}, { 500.0,-500.0,-700.0}, { 500.0,-500.0,-600.0}, { 500.0,-500.0,-500.0}, { 500.0,-500.0,-400.0}, { 500.0,-500.0,-300.0}, { 500.0,-500.0,-200.0}, { 500.0,-500.0,-100.0}, { 500.0,-500.0, 0.0}, { 500.0,-500.0, 100.0}, { 500.0,-500.0, 200.0}, { 500.0,-500.0, 300.0}, { 500.0,-500.0, 400.0}, { 500.0,-500.0, 500.0}, { 500.0,-500.0, 600.0}, { 500.0,-500.0, 700.0}, { 500.0,-500.0, 800.0}, { 500.0,-400.0,-800.0}, { 500.0,-400.0,-700.0}, { 500.0,-400.0,-600.0}, { 500.0,-400.0,-500.0}, { 500.0,-400.0,-400.0}, { 500.0,-400.0,-300.0}, { 500.0,-400.0,-200.0}, { 500.0,-400.0,-100.0}, { 500.0,-400.0, 0.0}, { 500.0,-400.0, 100.0}, { 500.0,-400.0, 200.0}, { 500.0,-400.0, 300.0}, { 500.0,-400.0, 400.0}, { 500.0,-400.0, 500.0}, { 500.0,-400.0, 600.0}, { 500.0,-400.0, 700.0}, { 500.0,-400.0, 800.0}, { 500.0,-300.0,-800.0}, { 500.0,-300.0,-700.0}, { 500.0,-300.0,-600.0}, { 500.0,-300.0,-500.0}, { 500.0,-300.0,-400.0}, { 500.0,-300.0,-300.0}, { 500.0,-300.0,-200.0}, { 500.0,-300.0,-100.0}, { 500.0,-300.0, 0.0}, { 500.0,-300.0, 100.0}, { 500.0,-300.0, 200.0}, { 500.0,-300.0, 300.0}, { 500.0,-300.0, 400.0}, { 500.0,-300.0, 500.0}, { 500.0,-300.0, 600.0}, { 500.0,-300.0, 700.0}, { 500.0,-300.0, 800.0}, { 500.0,-200.0,-800.0}, { 500.0,-200.0,-700.0}, { 500.0,-200.0,-600.0}, { 500.0,-200.0,-500.0}, { 500.0,-200.0,-400.0}, { 500.0,-200.0,-300.0}, { 500.0,-200.0,-200.0}, { 500.0,-200.0,-100.0}, { 500.0,-200.0, 0.0}, { 500.0,-200.0, 100.0}, { 500.0,-200.0, 200.0}, { 500.0,-200.0, 300.0}, { 500.0,-200.0, 400.0}, { 500.0,-200.0, 500.0}, { 500.0,-200.0, 600.0}, { 500.0,-200.0, 700.0}, { 500.0,-200.0, 800.0}, { 500.0,-100.0,-800.0}, { 500.0,-100.0,-700.0}, { 500.0,-100.0,-600.0}, { 500.0,-100.0,-500.0}, { 500.0,-100.0,-400.0}, { 500.0,-100.0,-300.0}, { 500.0,-100.0,-200.0}, { 500.0,-100.0,-100.0}, { 500.0,-100.0, 0.0}, { 500.0,-100.0, 100.0}, { 500.0,-100.0, 200.0}, { 500.0,-100.0, 300.0}, { 500.0,-100.0, 400.0}, { 500.0,-100.0, 500.0}, { 500.0,-100.0, 600.0}, { 500.0,-100.0, 700.0}, { 500.0,-100.0, 800.0}, { 500.0, 0.0,-800.0}, { 500.0, 0.0,-700.0}, { 500.0, 0.0,-600.0}, { 500.0, 0.0,-500.0}, { 500.0, 0.0,-400.0}, { 500.0, 0.0,-300.0}, { 500.0, 0.0,-200.0}, { 500.0, 0.0,-100.0}, { 500.0, 0.0, 0.0}, { 500.0, 0.0, 100.0}, { 500.0, 0.0, 200.0}, { 500.0, 0.0, 300.0}, { 500.0, 0.0, 400.0}, { 500.0, 0.0, 500.0}, { 500.0, 0.0, 600.0}, { 500.0, 0.0, 700.0}, { 500.0, 0.0, 800.0}, { 500.0, 100.0,-800.0}, { 500.0, 100.0,-700.0}, { 500.0, 100.0,-600.0}, { 500.0, 100.0,-500.0}, { 500.0, 100.0,-400.0}, { 500.0, 100.0,-300.0}, { 500.0, 100.0,-200.0}, { 500.0, 100.0,-100.0}, { 500.0, 100.0, 0.0}, { 500.0, 100.0, 100.0}, { 500.0, 100.0, 200.0}, { 500.0, 100.0, 300.0}, { 500.0, 100.0, 400.0}, { 500.0, 100.0, 500.0}, { 500.0, 100.0, 600.0}, { 500.0, 100.0, 700.0}, { 500.0, 100.0, 800.0}, { 500.0, 200.0,-800.0}, { 500.0, 200.0,-700.0}, { 500.0, 200.0,-600.0}, { 500.0, 200.0,-500.0}, { 500.0, 200.0,-400.0}, { 500.0, 200.0,-300.0}, { 500.0, 200.0,-200.0}, { 500.0, 200.0,-100.0}, { 500.0, 200.0, 0.0}, { 500.0, 200.0, 100.0}, { 500.0, 200.0, 200.0}, { 500.0, 200.0, 300.0}, { 500.0, 200.0, 400.0}, { 500.0, 200.0, 500.0}, { 500.0, 200.0, 600.0}, { 500.0, 200.0, 700.0}, { 500.0, 200.0, 800.0}, { 500.0, 300.0,-800.0}, { 500.0, 300.0,-700.0}, { 500.0, 300.0,-600.0}, { 500.0, 300.0,-500.0}, { 500.0, 300.0,-400.0}, { 500.0, 300.0,-300.0}, { 500.0, 300.0,-200.0}, { 500.0, 300.0,-100.0}, { 500.0, 300.0, 0.0}, { 500.0, 300.0, 100.0}, { 500.0, 300.0, 200.0}, { 500.0, 300.0, 300.0}, { 500.0, 300.0, 400.0}, { 500.0, 300.0, 500.0}, { 500.0, 300.0, 600.0}, { 500.0, 300.0, 700.0}, { 500.0, 300.0, 800.0}, { 500.0, 400.0,-800.0}, { 500.0, 400.0,-700.0}, { 500.0, 400.0,-600.0}, { 500.0, 400.0,-500.0}, { 500.0, 400.0,-400.0}, { 500.0, 400.0,-300.0}, { 500.0, 400.0,-200.0}, { 500.0, 400.0,-100.0}, { 500.0, 400.0, 0.0}, { 500.0, 400.0, 100.0}, { 500.0, 400.0, 200.0}, { 500.0, 400.0, 300.0}, { 500.0, 400.0, 400.0}, { 500.0, 400.0, 500.0}, { 500.0, 400.0, 600.0}, { 500.0, 400.0, 700.0}, { 500.0, 400.0, 800.0}, { 500.0, 500.0,-800.0}, { 500.0, 500.0,-700.0}, { 500.0, 500.0,-600.0}, { 500.0, 500.0,-500.0}, { 500.0, 500.0,-400.0}, { 500.0, 500.0,-300.0}, { 500.0, 500.0,-200.0}, { 500.0, 500.0,-100.0}, { 500.0, 500.0, 0.0}, { 500.0, 500.0, 100.0}, { 500.0, 500.0, 200.0}, { 500.0, 500.0, 300.0}, { 500.0, 500.0, 400.0}, { 500.0, 500.0, 500.0}, { 500.0, 500.0, 600.0}, { 500.0, 500.0, 700.0}, { 500.0, 500.0, 800.0}, { 500.0, 600.0,-800.0}, { 500.0, 600.0,-700.0}, { 500.0, 600.0,-600.0}, { 500.0, 600.0,-500.0}, { 500.0, 600.0,-400.0}, { 500.0, 600.0,-300.0}, { 500.0, 600.0,-200.0}, { 500.0, 600.0,-100.0}, { 500.0, 600.0, 0.0}, { 500.0, 600.0, 100.0}, { 500.0, 600.0, 200.0}, { 500.0, 600.0, 300.0}, { 500.0, 600.0, 400.0}, { 500.0, 600.0, 500.0}, { 500.0, 600.0, 600.0}, { 500.0, 600.0, 700.0}, { 500.0, 600.0, 800.0}, { 500.0, 700.0,-800.0}, { 500.0, 700.0,-700.0}, { 500.0, 700.0,-600.0}, { 500.0, 700.0,-500.0}, { 500.0, 700.0,-400.0}, { 500.0, 700.0,-300.0}, { 500.0, 700.0,-200.0}, { 500.0, 700.0,-100.0}, { 500.0, 700.0, 0.0}, { 500.0, 700.0, 100.0}, { 500.0, 700.0, 200.0}, { 500.0, 700.0, 300.0}, { 500.0, 700.0, 400.0}, { 500.0, 700.0, 500.0}, { 500.0, 700.0, 600.0}, { 500.0, 700.0, 700.0}, { 500.0, 700.0, 800.0}, { 500.0, 800.0,-800.0}, { 500.0, 800.0,-700.0}, { 500.0, 800.0,-600.0}, { 500.0, 800.0,-500.0}, { 500.0, 800.0,-400.0}, { 500.0, 800.0,-300.0}, { 500.0, 800.0,-200.0}, { 500.0, 800.0,-100.0}, { 500.0, 800.0, 0.0}, { 500.0, 800.0, 100.0}, { 500.0, 800.0, 200.0}, { 500.0, 800.0, 300.0}, { 500.0, 800.0, 400.0}, { 500.0, 800.0, 500.0}, { 500.0, 800.0, 600.0}, { 500.0, 800.0, 700.0}, { 500.0, 800.0, 800.0}, { 600.0,-800.0,-800.0}, { 600.0,-800.0,-700.0}, { 600.0,-800.0,-600.0}, { 600.0,-800.0,-500.0}, { 600.0,-800.0,-400.0}, { 600.0,-800.0,-300.0}, { 600.0,-800.0,-200.0}, { 600.0,-800.0,-100.0}, { 600.0,-800.0, 0.0}, { 600.0,-800.0, 100.0}, { 600.0,-800.0, 200.0}, { 600.0,-800.0, 300.0}, { 600.0,-800.0, 400.0}, { 600.0,-800.0, 500.0}, { 600.0,-800.0, 600.0}, { 600.0,-800.0, 700.0}, { 600.0,-800.0, 800.0}, { 600.0,-700.0,-800.0}, { 600.0,-700.0,-700.0}, { 600.0,-700.0,-600.0}, { 600.0,-700.0,-500.0}, { 600.0,-700.0,-400.0}, { 600.0,-700.0,-300.0}, { 600.0,-700.0,-200.0}, { 600.0,-700.0,-100.0}, { 600.0,-700.0, 0.0}, { 600.0,-700.0, 100.0}, { 600.0,-700.0, 200.0}, { 600.0,-700.0, 300.0}, { 600.0,-700.0, 400.0}, { 600.0,-700.0, 500.0}, { 600.0,-700.0, 600.0}, { 600.0,-700.0, 700.0}, { 600.0,-700.0, 800.0}, { 600.0,-600.0,-800.0}, { 600.0,-600.0,-700.0}, { 600.0,-600.0,-600.0}, { 600.0,-600.0,-500.0}, { 600.0,-600.0,-400.0}, { 600.0,-600.0,-300.0}, { 600.0,-600.0,-200.0}, { 600.0,-600.0,-100.0}, { 600.0,-600.0, 0.0}, { 600.0,-600.0, 100.0}, { 600.0,-600.0, 200.0}, { 600.0,-600.0, 300.0}, { 600.0,-600.0, 400.0}, { 600.0,-600.0, 500.0}, { 600.0,-600.0, 600.0}, { 600.0,-600.0, 700.0}, { 600.0,-600.0, 800.0}, { 600.0,-500.0,-800.0}, { 600.0,-500.0,-700.0}, { 600.0,-500.0,-600.0}, { 600.0,-500.0,-500.0}, { 600.0,-500.0,-400.0}, { 600.0,-500.0,-300.0}, { 600.0,-500.0,-200.0}, { 600.0,-500.0,-100.0}, { 600.0,-500.0, 0.0}, { 600.0,-500.0, 100.0}, { 600.0,-500.0, 200.0}, { 600.0,-500.0, 300.0}, { 600.0,-500.0, 400.0}, { 600.0,-500.0, 500.0}, { 600.0,-500.0, 600.0}, { 600.0,-500.0, 700.0}, { 600.0,-500.0, 800.0}, { 600.0,-400.0,-800.0}, { 600.0,-400.0,-700.0}, { 600.0,-400.0,-600.0}, { 600.0,-400.0,-500.0}, { 600.0,-400.0,-400.0}, { 600.0,-400.0,-300.0}, { 600.0,-400.0,-200.0}, { 600.0,-400.0,-100.0}, { 600.0,-400.0, 0.0}, { 600.0,-400.0, 100.0}, { 600.0,-400.0, 200.0}, { 600.0,-400.0, 300.0}, { 600.0,-400.0, 400.0}, { 600.0,-400.0, 500.0}, { 600.0,-400.0, 600.0}, { 600.0,-400.0, 700.0}, { 600.0,-400.0, 800.0}, { 600.0,-300.0,-800.0}, { 600.0,-300.0,-700.0}, { 600.0,-300.0,-600.0}, { 600.0,-300.0,-500.0}, { 600.0,-300.0,-400.0}, { 600.0,-300.0,-300.0}, { 600.0,-300.0,-200.0}, { 600.0,-300.0,-100.0}, { 600.0,-300.0, 0.0}, { 600.0,-300.0, 100.0}, { 600.0,-300.0, 200.0}, { 600.0,-300.0, 300.0}, { 600.0,-300.0, 400.0}, { 600.0,-300.0, 500.0}, { 600.0,-300.0, 600.0}, { 600.0,-300.0, 700.0}, { 600.0,-300.0, 800.0}, { 600.0,-200.0,-800.0}, { 600.0,-200.0,-700.0}, { 600.0,-200.0,-600.0}, { 600.0,-200.0,-500.0}, { 600.0,-200.0,-400.0}, { 600.0,-200.0,-300.0}, { 600.0,-200.0,-200.0}, { 600.0,-200.0,-100.0}, { 600.0,-200.0, 0.0}, { 600.0,-200.0, 100.0}, { 600.0,-200.0, 200.0}, { 600.0,-200.0, 300.0}, { 600.0,-200.0, 400.0}, { 600.0,-200.0, 500.0}, { 600.0,-200.0, 600.0}, { 600.0,-200.0, 700.0}, { 600.0,-200.0, 800.0}, { 600.0,-100.0,-800.0}, { 600.0,-100.0,-700.0}, { 600.0,-100.0,-600.0}, { 600.0,-100.0,-500.0}, { 600.0,-100.0,-400.0}, { 600.0,-100.0,-300.0}, { 600.0,-100.0,-200.0}, { 600.0,-100.0,-100.0}, { 600.0,-100.0, 0.0}, { 600.0,-100.0, 100.0}, { 600.0,-100.0, 200.0}, { 600.0,-100.0, 300.0}, { 600.0,-100.0, 400.0}, { 600.0,-100.0, 500.0}, { 600.0,-100.0, 600.0}, { 600.0,-100.0, 700.0}, { 600.0,-100.0, 800.0}, { 600.0, 0.0,-800.0}, { 600.0, 0.0,-700.0}, { 600.0, 0.0,-600.0}, { 600.0, 0.0,-500.0}, { 600.0, 0.0,-400.0}, { 600.0, 0.0,-300.0}, { 600.0, 0.0,-200.0}, { 600.0, 0.0,-100.0}, { 600.0, 0.0, 0.0}, { 600.0, 0.0, 100.0}, { 600.0, 0.0, 200.0}, { 600.0, 0.0, 300.0}, { 600.0, 0.0, 400.0}, { 600.0, 0.0, 500.0}, { 600.0, 0.0, 600.0}, { 600.0, 0.0, 700.0}, { 600.0, 0.0, 800.0}, { 600.0, 100.0,-800.0}, { 600.0, 100.0,-700.0}, { 600.0, 100.0,-600.0}, { 600.0, 100.0,-500.0}, { 600.0, 100.0,-400.0}, { 600.0, 100.0,-300.0}, { 600.0, 100.0,-200.0}, { 600.0, 100.0,-100.0}, { 600.0, 100.0, 0.0}, { 600.0, 100.0, 100.0}, { 600.0, 100.0, 200.0}, { 600.0, 100.0, 300.0}, { 600.0, 100.0, 400.0}, { 600.0, 100.0, 500.0}, { 600.0, 100.0, 600.0}, { 600.0, 100.0, 700.0}, { 600.0, 100.0, 800.0}, { 600.0, 200.0,-800.0}, { 600.0, 200.0,-700.0}, { 600.0, 200.0,-600.0}, { 600.0, 200.0,-500.0}, { 600.0, 200.0,-400.0}, { 600.0, 200.0,-300.0}, { 600.0, 200.0,-200.0}, { 600.0, 200.0,-100.0}, { 600.0, 200.0, 0.0}, { 600.0, 200.0, 100.0}, { 600.0, 200.0, 200.0}, { 600.0, 200.0, 300.0}, { 600.0, 200.0, 400.0}, { 600.0, 200.0, 500.0}, { 600.0, 200.0, 600.0}, { 600.0, 200.0, 700.0}, { 600.0, 200.0, 800.0}, { 600.0, 300.0,-800.0}, { 600.0, 300.0,-700.0}, { 600.0, 300.0,-600.0}, { 600.0, 300.0,-500.0}, { 600.0, 300.0,-400.0}, { 600.0, 300.0,-300.0}, { 600.0, 300.0,-200.0}, { 600.0, 300.0,-100.0}, { 600.0, 300.0, 0.0}, { 600.0, 300.0, 100.0}, { 600.0, 300.0, 200.0}, { 600.0, 300.0, 300.0}, { 600.0, 300.0, 400.0}, { 600.0, 300.0, 500.0}, { 600.0, 300.0, 600.0}, { 600.0, 300.0, 700.0}, { 600.0, 300.0, 800.0}, { 600.0, 400.0,-800.0}, { 600.0, 400.0,-700.0}, { 600.0, 400.0,-600.0}, { 600.0, 400.0,-500.0}, { 600.0, 400.0,-400.0}, { 600.0, 400.0,-300.0}, { 600.0, 400.0,-200.0}, { 600.0, 400.0,-100.0}, { 600.0, 400.0, 0.0}, { 600.0, 400.0, 100.0}, { 600.0, 400.0, 200.0}, { 600.0, 400.0, 300.0}, { 600.0, 400.0, 400.0}, { 600.0, 400.0, 500.0}, { 600.0, 400.0, 600.0}, { 600.0, 400.0, 700.0}, { 600.0, 400.0, 800.0}, { 600.0, 500.0,-800.0}, { 600.0, 500.0,-700.0}, { 600.0, 500.0,-600.0}, { 600.0, 500.0,-500.0}, { 600.0, 500.0,-400.0}, { 600.0, 500.0,-300.0}, { 600.0, 500.0,-200.0}, { 600.0, 500.0,-100.0}, { 600.0, 500.0, 0.0}, { 600.0, 500.0, 100.0}, { 600.0, 500.0, 200.0}, { 600.0, 500.0, 300.0}, { 600.0, 500.0, 400.0}, { 600.0, 500.0, 500.0}, { 600.0, 500.0, 600.0}, { 600.0, 500.0, 700.0}, { 600.0, 500.0, 800.0}, { 600.0, 600.0,-800.0}, { 600.0, 600.0,-700.0}, { 600.0, 600.0,-600.0}, { 600.0, 600.0,-500.0}, { 600.0, 600.0,-400.0}, { 600.0, 600.0,-300.0}, { 600.0, 600.0,-200.0}, { 600.0, 600.0,-100.0}, { 600.0, 600.0, 0.0}, { 600.0, 600.0, 100.0}, { 600.0, 600.0, 200.0}, { 600.0, 600.0, 300.0}, { 600.0, 600.0, 400.0}, { 600.0, 600.0, 500.0}, { 600.0, 600.0, 600.0}, { 600.0, 600.0, 700.0}, { 600.0, 600.0, 800.0}, { 600.0, 700.0,-800.0}, { 600.0, 700.0,-700.0}, { 600.0, 700.0,-600.0}, { 600.0, 700.0,-500.0}, { 600.0, 700.0,-400.0}, { 600.0, 700.0,-300.0}, { 600.0, 700.0,-200.0}, { 600.0, 700.0,-100.0}, { 600.0, 700.0, 0.0}, { 600.0, 700.0, 100.0}, { 600.0, 700.0, 200.0}, { 600.0, 700.0, 300.0}, { 600.0, 700.0, 400.0}, { 600.0, 700.0, 500.0}, { 600.0, 700.0, 600.0}, { 600.0, 700.0, 700.0}, { 600.0, 700.0, 800.0}, { 600.0, 800.0,-800.0}, { 600.0, 800.0,-700.0}, { 600.0, 800.0,-600.0}, { 600.0, 800.0,-500.0}, { 600.0, 800.0,-400.0}, { 600.0, 800.0,-300.0}, { 600.0, 800.0,-200.0}, { 600.0, 800.0,-100.0}, { 600.0, 800.0, 0.0}, { 600.0, 800.0, 100.0}, { 600.0, 800.0, 200.0}, { 600.0, 800.0, 300.0}, { 600.0, 800.0, 400.0}, { 600.0, 800.0, 500.0}, { 600.0, 800.0, 600.0}, { 600.0, 800.0, 700.0}, { 600.0, 800.0, 800.0}, { 700.0,-800.0,-800.0}, { 700.0,-800.0,-700.0}, { 700.0,-800.0,-600.0}, { 700.0,-800.0,-500.0}, { 700.0,-800.0,-400.0}, { 700.0,-800.0,-300.0}, { 700.0,-800.0,-200.0}, { 700.0,-800.0,-100.0}, { 700.0,-800.0, 0.0}, { 700.0,-800.0, 100.0}, { 700.0,-800.0, 200.0}, { 700.0,-800.0, 300.0}, { 700.0,-800.0, 400.0}, { 700.0,-800.0, 500.0}, { 700.0,-800.0, 600.0}, { 700.0,-800.0, 700.0}, { 700.0,-800.0, 800.0}, { 700.0,-700.0,-800.0}, { 700.0,-700.0,-700.0}, { 700.0,-700.0,-600.0}, { 700.0,-700.0,-500.0}, { 700.0,-700.0,-400.0}, { 700.0,-700.0,-300.0}, { 700.0,-700.0,-200.0}, { 700.0,-700.0,-100.0}, { 700.0,-700.0, 0.0}, { 700.0,-700.0, 100.0}, { 700.0,-700.0, 200.0}, { 700.0,-700.0, 300.0}, { 700.0,-700.0, 400.0}, { 700.0,-700.0, 500.0}, { 700.0,-700.0, 600.0}, { 700.0,-700.0, 700.0}, { 700.0,-700.0, 800.0}, { 700.0,-600.0,-800.0}, { 700.0,-600.0,-700.0}, { 700.0,-600.0,-600.0}, { 700.0,-600.0,-500.0}, { 700.0,-600.0,-400.0}, { 700.0,-600.0,-300.0}, { 700.0,-600.0,-200.0}, { 700.0,-600.0,-100.0}, { 700.0,-600.0, 0.0}, { 700.0,-600.0, 100.0}, { 700.0,-600.0, 200.0}, { 700.0,-600.0, 300.0}, { 700.0,-600.0, 400.0}, { 700.0,-600.0, 500.0}, { 700.0,-600.0, 600.0}, { 700.0,-600.0, 700.0}, { 700.0,-600.0, 800.0}, { 700.0,-500.0,-800.0}, { 700.0,-500.0,-700.0}, { 700.0,-500.0,-600.0}, { 700.0,-500.0,-500.0}, { 700.0,-500.0,-400.0}, { 700.0,-500.0,-300.0}, { 700.0,-500.0,-200.0}, { 700.0,-500.0,-100.0}, { 700.0,-500.0, 0.0}, { 700.0,-500.0, 100.0}, { 700.0,-500.0, 200.0}, { 700.0,-500.0, 300.0}, { 700.0,-500.0, 400.0}, { 700.0,-500.0, 500.0}, { 700.0,-500.0, 600.0}, { 700.0,-500.0, 700.0}, { 700.0,-500.0, 800.0}, { 700.0,-400.0,-800.0}, { 700.0,-400.0,-700.0}, { 700.0,-400.0,-600.0}, { 700.0,-400.0,-500.0}, { 700.0,-400.0,-400.0}, { 700.0,-400.0,-300.0}, { 700.0,-400.0,-200.0}, { 700.0,-400.0,-100.0}, { 700.0,-400.0, 0.0}, { 700.0,-400.0, 100.0}, { 700.0,-400.0, 200.0}, { 700.0,-400.0, 300.0}, { 700.0,-400.0, 400.0}, { 700.0,-400.0, 500.0}, { 700.0,-400.0, 600.0}, { 700.0,-400.0, 700.0}, { 700.0,-400.0, 800.0}, { 700.0,-300.0,-800.0}, { 700.0,-300.0,-700.0}, { 700.0,-300.0,-600.0}, { 700.0,-300.0,-500.0}, { 700.0,-300.0,-400.0}, { 700.0,-300.0,-300.0}, { 700.0,-300.0,-200.0}, { 700.0,-300.0,-100.0}, { 700.0,-300.0, 0.0}, { 700.0,-300.0, 100.0}, { 700.0,-300.0, 200.0}, { 700.0,-300.0, 300.0}, { 700.0,-300.0, 400.0}, { 700.0,-300.0, 500.0}, { 700.0,-300.0, 600.0}, { 700.0,-300.0, 700.0}, { 700.0,-300.0, 800.0}, { 700.0,-200.0,-800.0}, { 700.0,-200.0,-700.0}, { 700.0,-200.0,-600.0}, { 700.0,-200.0,-500.0}, { 700.0,-200.0,-400.0}, { 700.0,-200.0,-300.0}, { 700.0,-200.0,-200.0}, { 700.0,-200.0,-100.0}, { 700.0,-200.0, 0.0}, { 700.0,-200.0, 100.0}, { 700.0,-200.0, 200.0}, { 700.0,-200.0, 300.0}, { 700.0,-200.0, 400.0}, { 700.0,-200.0, 500.0}, { 700.0,-200.0, 600.0}, { 700.0,-200.0, 700.0}, { 700.0,-200.0, 800.0}, { 700.0,-100.0,-800.0}, { 700.0,-100.0,-700.0}, { 700.0,-100.0,-600.0}, { 700.0,-100.0,-500.0}, { 700.0,-100.0,-400.0}, { 700.0,-100.0,-300.0}, { 700.0,-100.0,-200.0}, { 700.0,-100.0,-100.0}, { 700.0,-100.0, 0.0}, { 700.0,-100.0, 100.0}, { 700.0,-100.0, 200.0}, { 700.0,-100.0, 300.0}, { 700.0,-100.0, 400.0}, { 700.0,-100.0, 500.0}, { 700.0,-100.0, 600.0}, { 700.0,-100.0, 700.0}, { 700.0,-100.0, 800.0}, { 700.0, 0.0,-800.0}, { 700.0, 0.0,-700.0}, { 700.0, 0.0,-600.0}, { 700.0, 0.0,-500.0}, { 700.0, 0.0,-400.0}, { 700.0, 0.0,-300.0}, { 700.0, 0.0,-200.0}, { 700.0, 0.0,-100.0}, { 700.0, 0.0, 0.0}, { 700.0, 0.0, 100.0}, { 700.0, 0.0, 200.0}, { 700.0, 0.0, 300.0}, { 700.0, 0.0, 400.0}, { 700.0, 0.0, 500.0}, { 700.0, 0.0, 600.0}, { 700.0, 0.0, 700.0}, { 700.0, 0.0, 800.0}, { 700.0, 100.0,-800.0}, { 700.0, 100.0,-700.0}, { 700.0, 100.0,-600.0}, { 700.0, 100.0,-500.0}, { 700.0, 100.0,-400.0}, { 700.0, 100.0,-300.0}, { 700.0, 100.0,-200.0}, { 700.0, 100.0,-100.0}, { 700.0, 100.0, 0.0}, { 700.0, 100.0, 100.0}, { 700.0, 100.0, 200.0}, { 700.0, 100.0, 300.0}, { 700.0, 100.0, 400.0}, { 700.0, 100.0, 500.0}, { 700.0, 100.0, 600.0}, { 700.0, 100.0, 700.0}, { 700.0, 100.0, 800.0}, { 700.0, 200.0,-800.0}, { 700.0, 200.0,-700.0}, { 700.0, 200.0,-600.0}, { 700.0, 200.0,-500.0}, { 700.0, 200.0,-400.0}, { 700.0, 200.0,-300.0}, { 700.0, 200.0,-200.0}, { 700.0, 200.0,-100.0}, { 700.0, 200.0, 0.0}, { 700.0, 200.0, 100.0}, { 700.0, 200.0, 200.0}, { 700.0, 200.0, 300.0}, { 700.0, 200.0, 400.0}, { 700.0, 200.0, 500.0}, { 700.0, 200.0, 600.0}, { 700.0, 200.0, 700.0}, { 700.0, 200.0, 800.0}, { 700.0, 300.0,-800.0}, { 700.0, 300.0,-700.0}, { 700.0, 300.0,-600.0}, { 700.0, 300.0,-500.0}, { 700.0, 300.0,-400.0}, { 700.0, 300.0,-300.0}, { 700.0, 300.0,-200.0}, { 700.0, 300.0,-100.0}, { 700.0, 300.0, 0.0}, { 700.0, 300.0, 100.0}, { 700.0, 300.0, 200.0}, { 700.0, 300.0, 300.0}, { 700.0, 300.0, 400.0}, { 700.0, 300.0, 500.0}, { 700.0, 300.0, 600.0}, { 700.0, 300.0, 700.0}, { 700.0, 300.0, 800.0}, { 700.0, 400.0,-800.0}, { 700.0, 400.0,-700.0}, { 700.0, 400.0,-600.0}, { 700.0, 400.0,-500.0}, { 700.0, 400.0,-400.0}, { 700.0, 400.0,-300.0}, { 700.0, 400.0,-200.0}, { 700.0, 400.0,-100.0}, { 700.0, 400.0, 0.0}, { 700.0, 400.0, 100.0}, { 700.0, 400.0, 200.0}, { 700.0, 400.0, 300.0}, { 700.0, 400.0, 400.0}, { 700.0, 400.0, 500.0}, { 700.0, 400.0, 600.0}, { 700.0, 400.0, 700.0}, { 700.0, 400.0, 800.0}, { 700.0, 500.0,-800.0}, { 700.0, 500.0,-700.0}, { 700.0, 500.0,-600.0}, { 700.0, 500.0,-500.0}, { 700.0, 500.0,-400.0}, { 700.0, 500.0,-300.0}, { 700.0, 500.0,-200.0}, { 700.0, 500.0,-100.0}, { 700.0, 500.0, 0.0}, { 700.0, 500.0, 100.0}, { 700.0, 500.0, 200.0}, { 700.0, 500.0, 300.0}, { 700.0, 500.0, 400.0}, { 700.0, 500.0, 500.0}, { 700.0, 500.0, 600.0}, { 700.0, 500.0, 700.0}, { 700.0, 500.0, 800.0}, { 700.0, 600.0,-800.0}, { 700.0, 600.0,-700.0}, { 700.0, 600.0,-600.0}, { 700.0, 600.0,-500.0}, { 700.0, 600.0,-400.0}, { 700.0, 600.0,-300.0}, { 700.0, 600.0,-200.0}, { 700.0, 600.0,-100.0}, { 700.0, 600.0, 0.0}, { 700.0, 600.0, 100.0}, { 700.0, 600.0, 200.0}, { 700.0, 600.0, 300.0}, { 700.0, 600.0, 400.0}, { 700.0, 600.0, 500.0}, { 700.0, 600.0, 600.0}, { 700.0, 600.0, 700.0}, { 700.0, 600.0, 800.0}, { 700.0, 700.0,-800.0}, { 700.0, 700.0,-700.0}, { 700.0, 700.0,-600.0}, { 700.0, 700.0,-500.0}, { 700.0, 700.0,-400.0}, { 700.0, 700.0,-300.0}, { 700.0, 700.0,-200.0}, { 700.0, 700.0,-100.0}, { 700.0, 700.0, 0.0}, { 700.0, 700.0, 100.0}, { 700.0, 700.0, 200.0}, { 700.0, 700.0, 300.0}, { 700.0, 700.0, 400.0}, { 700.0, 700.0, 500.0}, { 700.0, 700.0, 600.0}, { 700.0, 700.0, 700.0}, { 700.0, 700.0, 800.0}, { 700.0, 800.0,-800.0}, { 700.0, 800.0,-700.0}, { 700.0, 800.0,-600.0}, { 700.0, 800.0,-500.0}, { 700.0, 800.0,-400.0}, { 700.0, 800.0,-300.0}, { 700.0, 800.0,-200.0}, { 700.0, 800.0,-100.0}, { 700.0, 800.0, 0.0}, { 700.0, 800.0, 100.0}, { 700.0, 800.0, 200.0}, { 700.0, 800.0, 300.0}, { 700.0, 800.0, 400.0}, { 700.0, 800.0, 500.0}, { 700.0, 800.0, 600.0}, { 700.0, 800.0, 700.0}, { 700.0, 800.0, 800.0}, { 800.0,-800.0,-800.0}, { 800.0,-800.0,-700.0}, { 800.0,-800.0,-600.0}, { 800.0,-800.0,-500.0}, { 800.0,-800.0,-400.0}, { 800.0,-800.0,-300.0}, { 800.0,-800.0,-200.0}, { 800.0,-800.0,-100.0}, { 800.0,-800.0, 0.0}, { 800.0,-800.0, 100.0}, { 800.0,-800.0, 200.0}, { 800.0,-800.0, 300.0}, { 800.0,-800.0, 400.0}, { 800.0,-800.0, 500.0}, { 800.0,-800.0, 600.0}, { 800.0,-800.0, 700.0}, { 800.0,-800.0, 800.0}, { 800.0,-700.0,-800.0}, { 800.0,-700.0,-700.0}, { 800.0,-700.0,-600.0}, { 800.0,-700.0,-500.0}, { 800.0,-700.0,-400.0}, { 800.0,-700.0,-300.0}, { 800.0,-700.0,-200.0}, { 800.0,-700.0,-100.0}, { 800.0,-700.0, 0.0}, { 800.0,-700.0, 100.0}, { 800.0,-700.0, 200.0}, { 800.0,-700.0, 300.0}, { 800.0,-700.0, 400.0}, { 800.0,-700.0, 500.0}, { 800.0,-700.0, 600.0}, { 800.0,-700.0, 700.0}, { 800.0,-700.0, 800.0}, { 800.0,-600.0,-800.0}, { 800.0,-600.0,-700.0}, { 800.0,-600.0,-600.0}, { 800.0,-600.0,-500.0}, { 800.0,-600.0,-400.0}, { 800.0,-600.0,-300.0}, { 800.0,-600.0,-200.0}, { 800.0,-600.0,-100.0}, { 800.0,-600.0, 0.0}, { 800.0,-600.0, 100.0}, { 800.0,-600.0, 200.0}, { 800.0,-600.0, 300.0}, { 800.0,-600.0, 400.0}, { 800.0,-600.0, 500.0}, { 800.0,-600.0, 600.0}, { 800.0,-600.0, 700.0}, { 800.0,-600.0, 800.0}, { 800.0,-500.0,-800.0}, { 800.0,-500.0,-700.0}, { 800.0,-500.0,-600.0}, { 800.0,-500.0,-500.0}, { 800.0,-500.0,-400.0}, { 800.0,-500.0,-300.0}, { 800.0,-500.0,-200.0}, { 800.0,-500.0,-100.0}, { 800.0,-500.0, 0.0}, { 800.0,-500.0, 100.0}, { 800.0,-500.0, 200.0}, { 800.0,-500.0, 300.0}, { 800.0,-500.0, 400.0}, { 800.0,-500.0, 500.0}, { 800.0,-500.0, 600.0}, { 800.0,-500.0, 700.0}, { 800.0,-500.0, 800.0}, { 800.0,-400.0,-800.0}, { 800.0,-400.0,-700.0}, { 800.0,-400.0,-600.0}, { 800.0,-400.0,-500.0}, { 800.0,-400.0,-400.0}, { 800.0,-400.0,-300.0}, { 800.0,-400.0,-200.0}, { 800.0,-400.0,-100.0}, { 800.0,-400.0, 0.0}, { 800.0,-400.0, 100.0}, { 800.0,-400.0, 200.0}, { 800.0,-400.0, 300.0}, { 800.0,-400.0, 400.0}, { 800.0,-400.0, 500.0}, { 800.0,-400.0, 600.0}, { 800.0,-400.0, 700.0}, { 800.0,-400.0, 800.0}, { 800.0,-300.0,-800.0}, { 800.0,-300.0,-700.0}, { 800.0,-300.0,-600.0}, { 800.0,-300.0,-500.0}, { 800.0,-300.0,-400.0}, { 800.0,-300.0,-300.0}, { 800.0,-300.0,-200.0}, { 800.0,-300.0,-100.0}, { 800.0,-300.0, 0.0}, { 800.0,-300.0, 100.0}, { 800.0,-300.0, 200.0}, { 800.0,-300.0, 300.0}, { 800.0,-300.0, 400.0}, { 800.0,-300.0, 500.0}, { 800.0,-300.0, 600.0}, { 800.0,-300.0, 700.0}, { 800.0,-300.0, 800.0}, { 800.0,-200.0,-800.0}, { 800.0,-200.0,-700.0}, { 800.0,-200.0,-600.0}, { 800.0,-200.0,-500.0}, { 800.0,-200.0,-400.0}, { 800.0,-200.0,-300.0}, { 800.0,-200.0,-200.0}, { 800.0,-200.0,-100.0}, { 800.0,-200.0, 0.0}, { 800.0,-200.0, 100.0}, { 800.0,-200.0, 200.0}, { 800.0,-200.0, 300.0}, { 800.0,-200.0, 400.0}, { 800.0,-200.0, 500.0}, { 800.0,-200.0, 600.0}, { 800.0,-200.0, 700.0}, { 800.0,-200.0, 800.0}, { 800.0,-100.0,-800.0}, { 800.0,-100.0,-700.0}, { 800.0,-100.0,-600.0}, { 800.0,-100.0,-500.0}, { 800.0,-100.0,-400.0}, { 800.0,-100.0,-300.0}, { 800.0,-100.0,-200.0}, { 800.0,-100.0,-100.0}, { 800.0,-100.0, 0.0}, { 800.0,-100.0, 100.0}, { 800.0,-100.0, 200.0}, { 800.0,-100.0, 300.0}, { 800.0,-100.0, 400.0}, { 800.0,-100.0, 500.0}, { 800.0,-100.0, 600.0}, { 800.0,-100.0, 700.0}, { 800.0,-100.0, 800.0}, { 800.0, 0.0,-800.0}, { 800.0, 0.0,-700.0}, { 800.0, 0.0,-600.0}, { 800.0, 0.0,-500.0}, { 800.0, 0.0,-400.0}, { 800.0, 0.0,-300.0}, { 800.0, 0.0,-200.0}, { 800.0, 0.0,-100.0}, { 800.0, 0.0, 0.0}, { 800.0, 0.0, 100.0}, { 800.0, 0.0, 200.0}, { 800.0, 0.0, 300.0}, { 800.0, 0.0, 400.0}, { 800.0, 0.0, 500.0}, { 800.0, 0.0, 600.0}, { 800.0, 0.0, 700.0}, { 800.0, 0.0, 800.0}, { 800.0, 100.0,-800.0}, { 800.0, 100.0,-700.0}, { 800.0, 100.0,-600.0}, { 800.0, 100.0,-500.0}, { 800.0, 100.0,-400.0}, { 800.0, 100.0,-300.0}, { 800.0, 100.0,-200.0}, { 800.0, 100.0,-100.0}, { 800.0, 100.0, 0.0}, { 800.0, 100.0, 100.0}, { 800.0, 100.0, 200.0}, { 800.0, 100.0, 300.0}, { 800.0, 100.0, 400.0}, { 800.0, 100.0, 500.0}, { 800.0, 100.0, 600.0}, { 800.0, 100.0, 700.0}, { 800.0, 100.0, 800.0}, { 800.0, 200.0,-800.0}, { 800.0, 200.0,-700.0}, { 800.0, 200.0,-600.0}, { 800.0, 200.0,-500.0}, { 800.0, 200.0,-400.0}, { 800.0, 200.0,-300.0}, { 800.0, 200.0,-200.0}, { 800.0, 200.0,-100.0}, { 800.0, 200.0, 0.0}, { 800.0, 200.0, 100.0}, { 800.0, 200.0, 200.0}, { 800.0, 200.0, 300.0}, { 800.0, 200.0, 400.0}, { 800.0, 200.0, 500.0}, { 800.0, 200.0, 600.0}, { 800.0, 200.0, 700.0}, { 800.0, 200.0, 800.0}, { 800.0, 300.0,-800.0}, { 800.0, 300.0,-700.0}, { 800.0, 300.0,-600.0}, { 800.0, 300.0,-500.0}, { 800.0, 300.0,-400.0}, { 800.0, 300.0,-300.0}, { 800.0, 300.0,-200.0}, { 800.0, 300.0,-100.0}, { 800.0, 300.0, 0.0}, { 800.0, 300.0, 100.0}, { 800.0, 300.0, 200.0}, { 800.0, 300.0, 300.0}, { 800.0, 300.0, 400.0}, { 800.0, 300.0, 500.0}, { 800.0, 300.0, 600.0}, { 800.0, 300.0, 700.0}, { 800.0, 300.0, 800.0}, { 800.0, 400.0,-800.0}, { 800.0, 400.0,-700.0}, { 800.0, 400.0,-600.0}, { 800.0, 400.0,-500.0}, { 800.0, 400.0,-400.0}, { 800.0, 400.0,-300.0}, { 800.0, 400.0,-200.0}, { 800.0, 400.0,-100.0}, { 800.0, 400.0, 0.0}, { 800.0, 400.0, 100.0}, { 800.0, 400.0, 200.0}, { 800.0, 400.0, 300.0}, { 800.0, 400.0, 400.0}, { 800.0, 400.0, 500.0}, { 800.0, 400.0, 600.0}, { 800.0, 400.0, 700.0}, { 800.0, 400.0, 800.0}, { 800.0, 500.0,-800.0}, { 800.0, 500.0,-700.0}, { 800.0, 500.0,-600.0}, { 800.0, 500.0,-500.0}, { 800.0, 500.0,-400.0}, { 800.0, 500.0,-300.0}, { 800.0, 500.0,-200.0}, { 800.0, 500.0,-100.0}, { 800.0, 500.0, 0.0}, { 800.0, 500.0, 100.0}, { 800.0, 500.0, 200.0}, { 800.0, 500.0, 300.0}, { 800.0, 500.0, 400.0}, { 800.0, 500.0, 500.0}, { 800.0, 500.0, 600.0}, { 800.0, 500.0, 700.0}, { 800.0, 500.0, 800.0}, { 800.0, 600.0,-800.0}, { 800.0, 600.0,-700.0}, { 800.0, 600.0,-600.0}, { 800.0, 600.0,-500.0}, { 800.0, 600.0,-400.0}, { 800.0, 600.0,-300.0}, { 800.0, 600.0,-200.0}, { 800.0, 600.0,-100.0}, { 800.0, 600.0, 0.0}, { 800.0, 600.0, 100.0}, { 800.0, 600.0, 200.0}, { 800.0, 600.0, 300.0}, { 800.0, 600.0, 400.0}, { 800.0, 600.0, 500.0}, { 800.0, 600.0, 600.0}, { 800.0, 600.0, 700.0}, { 800.0, 600.0, 800.0}, { 800.0, 700.0,-800.0}, { 800.0, 700.0,-700.0}, { 800.0, 700.0,-600.0}, { 800.0, 700.0,-500.0}, { 800.0, 700.0,-400.0}, { 800.0, 700.0,-300.0}, { 800.0, 700.0,-200.0}, { 800.0, 700.0,-100.0}, { 800.0, 700.0, 0.0}, { 800.0, 700.0, 100.0}, { 800.0, 700.0, 200.0}, { 800.0, 700.0, 300.0}, { 800.0, 700.0, 400.0}, { 800.0, 700.0, 500.0}, { 800.0, 700.0, 600.0}, { 800.0, 700.0, 700.0}, { 800.0, 700.0, 800.0}, { 800.0, 800.0,-800.0}, { 800.0, 800.0,-700.0}, { 800.0, 800.0,-600.0}, { 800.0, 800.0,-500.0}, { 800.0, 800.0,-400.0}, { 800.0, 800.0,-300.0}, { 800.0, 800.0,-200.0}, { 800.0, 800.0,-100.0}, { 800.0, 800.0, 0.0}, { 800.0, 800.0, 100.0}, { 800.0, 800.0, 200.0}, { 800.0, 800.0, 300.0}, { 800.0, 800.0, 400.0}, { 800.0, 800.0, 500.0}, { 800.0, 800.0, 600.0}, { 800.0, 800.0, 700.0}, { 800.0, 800.0, 800.0}, }; static double nlopt_nll2(unsigned int n, const double *x, double *grad, void *params) { size_t i; fitParams *fpars = (fitParams *) params; double theta, phi; double fval; struct timeval tv_start, tv_stop; vertex v[MAX_VERTICES]; if (stop) nlopt_force_stop(opt); for (i = 0; i < fpars->n; i++) { v[i].id = fpars->id[i]; v[i].T0 = x[4+3*i]; v[i].pos[0] = x[0]; v[i].pos[1] = x[1]; v[i].pos[2] = x[2]; v[i].t0 = x[3]; theta = x[5+3*i]; phi = x[6+3*i]; v[i].dir[0] = sin(theta)*cos(phi); v[i].dir[1] = sin(theta)*sin(phi); v[i].dir[2] = cos(theta); v[i].n = 0; } gettimeofday(&tv_start, NULL); fval = nll(fpars->ev, v, fpars->n, fpars->dx, fpars->ns, fpars->fast, fpars->charge_only, fpars->hit_only); gettimeofday(&tv_stop, NULL); long long elapsed = (tv_stop.tv_sec - tv_start.tv_sec)*1000 + (tv_stop.tv_usec - tv_start.tv_usec)/1000; if (fpars->print) { printf("%5zu %7.2f %7.2f %7.2f %6.2f ", iter++, x[0], x[1], x[2], x[3]); for (i = 0; i < fpars->n; i++) printf("%10.2f %7.2f %7.2f ", x[4+3*i], x[5+3*i], x[6+3*i]); printf("f() = %7.3e took %lld ms\n", fval, elapsed); } return fval; } static double nlopt_nll(unsigned int n, const double *x, double *grad, void *params) { fitParams *fpars = (fitParams *) params; double theta, phi; double fval; struct timeval tv_start, tv_stop; vertex v; if (stop) nlopt_force_stop(opt); v.id = fpars->id[0]; v.T0 = x[0]; v.pos[0] = x[1]; v.pos[1] = x[2]; v.pos[2] = x[3]; theta = x[4]; phi = x[5]; v.dir[0] = sin(theta)*cos(phi); v.dir[1] = sin(theta)*sin(phi); v.dir[2] = cos(theta); v.t0 = x[6]; v.z1[0] = x[7]; v.z2[0] = x[8]; v.n = 1; gettimeofday(&tv_start, NULL); fval = nll(fpars->ev, &v, 1, fpars->dx, fpars->ns, fpars->fast, fpars->charge_only, fpars->hit_only); gettimeofday(&tv_stop, NULL); long long elapsed = (tv_stop.tv_sec - tv_start.tv_sec)*1000 + (tv_stop.tv_usec - tv_start.tv_usec)/1000; if (fpars->print) printf("%5zu %10.2f %7.2f %7.2f %7.2f %5.2f %5.2f %6.2f %5.2f %5.2f f() = %7.3e took %lld ms\n", iter++, x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], fval, elapsed); return fval; } double guess_t0(event *ev, double *pos) { /* Returns a guess for the t0 of event `ev` given a position `pos`. The t0 * is calculated by computing the charge weighted average of the time * difference between each PMT's hit time and the time it would take a * photon to travel from `pos` to the PMT. */ size_t i; double pmt_dir[3], distance, t0, n, qhs_sum; /* Compute the index of refraction for heavy water at 400 nm. */ n = get_index_snoman_d2o(400.0); t0 = 0.0; qhs_sum = 0.0; for (i = 0; i < MAX_PMTS; i++) { /* Only look at normal PMTs that were hit and aren't flagged. */ if (ev->pmt_hits[i].flags || pmts[i].pmt_type != PMT_NORMAL || !ev->pmt_hits[i].hit) continue; /* Compute the vector between `pos` and the PMT. */ SUB(pmt_dir,pmts[i].pos,pos); /* Compute the distance to the PMT. */ distance = NORM(pmt_dir); /* Add the charge weighted time difference between the PMT hit time and * the time it would take a photon to hit the PMT from `pos`. */ t0 += ev->pmt_hits[i].q*(ev->pmt_hits[i].t - distance*n/SPEED_OF_LIGHT); qhs_sum += ev->pmt_hits[i].q; } /* Divide by the total QHS sum. */ t0 /= qhs_sum; return t0; } void guess_direction(event *ev, double *pos, double *theta, double *phi) { /* Returns the approximate direction of the event from a given position. * The direction is computed by taking the charge weighted average of the * vectors from `pos` to each hit PMT. * * A possible improvement here is to do something like a Hough transform * where we map PMT hits to cones with a 42 degree angle and then search * for the highest point in the transformed space. This method might also * generalize better when searching for a second ring since we can look for * secondary peaks not near the highest peak. */ size_t i; double pmt_dir[3], dir[3]; dir[0] = 0.0; dir[1] = 0.0; dir[2] = 0.0; for (i = 0; i < MAX_PMTS; i++) { /* Only look at normal PMTs that were hit and aren't flagged. */ if (ev->pmt_hits[i].flags || pmts[i].pmt_type != PMT_NORMAL || !ev->pmt_hits[i].hit) continue; /* Compute the vector between `pos` and the PMT. */ SUB(pmt_dir,pmts[i].pos,pos); /* Normalize it. */ normalize(pmt_dir); /* Multiply the vector by the QHS charge in the PMT. */ MUL(pmt_dir,ev->pmt_hits[i].q); /* Add this to the estimated direction. */ ADD(dir,dir,pmt_dir); } /* Normalize the charge weighted sum. */ normalize(dir); /* Compute the spherical coordinates for `dir`. */ *theta = acos(dir[2]); *phi = atan2(dir[1],dir[0]); } /* Returns the expected number of detected photons for a particle with type * `id` and kinetic energy `T0`. `distance` should be the distance to the PSUP * in cm. */ double get_expected_photons(int id, double T0, double distance, double cos_theta) { particle *p; double nphotons, E0, p0, beta0; p = particle_init(id, T0, 1000); /* Calculate total energy */ E0 = T0 + p->mass; p0 = sqrt(E0*E0 - p->mass*p->mass); beta0 = p0/E0; /* First we calculate the photons from Cerenkov emission of the particle * itself. */ switch (id) { case IDP_E_MINUS: case IDP_E_PLUS: case IDP_MU_MINUS: case IDP_MU_PLUS: case IDP_PROTON: nphotons = get_probability2(beta0)*fmin(p->range,distance); break; default: fprintf(stderr, "unknown particle id %i\n", id); particle_free(p); exit(1); } /* Now, we add the expected number of shower photons. */ if (p->shower_photons) nphotons += p->shower_photons*gsl_cdf_gamma_P(distance,p->pos_a,p->pos_b)*(1-interp1d(cos_theta,p->cos_theta,p->cdf_shower,p->n)); /* Now, we add the expected number of delta ray photons. */ if (p->delta_ray_photons) { if (distance > p->range) nphotons += p->delta_ray_photons*(1-interp1d(cos_theta,p->cos_theta,p->cdf_delta,p->n)); else nphotons += p->delta_ray_photons*distance/p->range*(1-interp1d(cos_theta,p->cos_theta,p->cdf_delta,p->n)); } particle_free(p); /* Finally we multiply by the average quantum efficiency and divide by 2 to * account for the PMT coverage. */ return nphotons*get_weighted_quantum_efficiency()/2.0; } typedef struct guessEnergyParams { int id; double distance; double qhs_sum; double cos_theta; } guessEnergyParams; /* Returns the expected number of photons minus the observed number of PE. This * function is used to bisect the most likely energy using Brent's method. */ static double get_expected_photons_root(double T0, void *params) { guessEnergyParams *pars; pars = (guessEnergyParams *) params; return get_expected_photons(pars->id,T0,pars->distance,pars->cos_theta) - pars->qhs_sum; } /* Returns the most likely kinetic energy for a given particle hypothesis. * `qhs_sum` should be the sum of the observed charge in units of PE. * `distance` is the distance to the PSUP in cm. `id` is the particle ID. * * On success, returns 0 and `T0` is set to the most likely energy. If there * was an error bisecting the most likely energy, returns -1. */ int bisect_energy(double qhs_sum, double distance, int id, double cos_theta, double *T0) { int status; gsl_root_fsolver *s; gsl_function F; int iter = 0, max_iter = 100; double x_lo, x_hi; double mass, Tmin, Tmax; guessEnergyParams pars; double n_d2o; n_d2o = get_index_snoman_d2o(400.0); pars.id = id; pars.distance = distance; pars.qhs_sum = qhs_sum; pars.cos_theta = cos_theta; switch (id) { case IDP_E_MINUS: case IDP_E_PLUS: mass = ELECTRON_MASS; Tmax = electron_get_max_energy(); break; case IDP_MU_MINUS: case IDP_MU_PLUS: mass = MUON_MASS; Tmax = muon_get_max_energy(); break; case IDP_PROTON: mass = PROTON_MASS; Tmax = proton_get_max_energy(); break; default: fprintf(stderr, "unknown particle id %i\n", id); exit(1); } /* Calculate the Cerenkov threshold for a muon. */ Tmin = mass/sqrt(1.0-1.0/(n_d2o*n_d2o)) - mass; if (get_expected_photons(id,Tmin,distance,cos_theta) > qhs_sum) return Tmin; if (get_expected_photons(id,Tmax,distance,cos_theta) < qhs_sum) return Tmax; s = gsl_root_fsolver_alloc(gsl_root_fsolver_brent); F.function = &get_expected_photons_root; F.params = &pars; gsl_root_fsolver_set(s, &F, Tmin, Tmax); do { iter++; status = gsl_root_fsolver_iterate(s); *T0 = gsl_root_fsolver_root(s); x_lo = gsl_root_fsolver_x_lower(s); x_hi = gsl_root_fsolver_x_upper(s); /* Find the root to within 1e-10 MeV. */ status = gsl_root_test_interval(x_lo, x_hi, 1e-10, 0); if (status == GSL_SUCCESS) break; } while (status == GSL_CONTINUE && iter < max_iter); gsl_root_fsolver_free(s); return status == GSL_SUCCESS ? 0 : -1; } /* Returns the approximate energy for a particle at position `pos` in direction * `dir`. This guess is made by summing up all the charge within a Cerenkov * cone and then bisecting the energy at which that many photons would be * produced. */ double guess_energy(event *ev, double *pos, double *dir, int id) { size_t i; double qhs_sum, n_d2o; double pmt_dir[3]; double T0; double distance_to_psup; n_d2o = get_index_snoman_d2o(400.0); qhs_sum = 0.0; for (i = 0; i < MAX_PMTS; i++) { if (ev->pmt_hits[i].flags || pmts[i].pmt_type != PMT_NORMAL || !ev->pmt_hits[i].hit) continue; SUB(pmt_dir,pmts[i].pos,pos); normalize(pmt_dir); if (DOT(pmt_dir,dir) > 1/n_d2o) qhs_sum += ev->pmt_hits[i].q; } if (NORM(pos) > PSUP_RADIUS || !intersect_sphere(pos,dir,PSUP_RADIUS,&distance_to_psup)) { /* If the particle is outside the PSUP or it doesn't intersect the * PSUP we just assume it produces no light. */ fprintf(stderr, "guess_energy: particle doesn't intersect PSUP!\n"); distance_to_psup = PSUP_RADIUS; } if (bisect_energy(qhs_sum, distance_to_psup, id, 1/n_d2o, &T0)) return qhs_sum/6.0; return T0; } int fit_event2(event *ev, double *xopt, double *fmin, int *id, size_t n, double maxtime, double f) { /* Fit the event `ev` under the hypothesis that it's from `n` particles * with ids `id`. The best fit parameters are stored in `xopt` upon success * and the negative log likelihood value at the minimum is stored in * `fmin`. The order of the parameters in `xopt` is: * * xopt[0] - x position (cm) * xopt[1] - y position (cm) * xopt[2] - z position (cm) * xopt[3] - t0 (ns) * xopt[4] - Kinetic energy of particle 1 (MeV) * xopt[5] - Theta direction of particle 1 (radians) * xopt[6] - Phi direction of particle 1 (radians) * xopt[7] - Kinetic energy of particle 2 (MeV) * xopt[8] - Theta direction of particle 2 (radians) * xopt[9] - Phi direction of particle 2 (radians) * ... * * `xopt` should be an array with at least 4+3*n elements. * * `maxtime` specifies the maximum time to perform the fit in seconds. Note * that before doing the full fit we try to calculate a good seed position * by running a "fast" likelihood calculation. This time does not count * towards the maximum so it is possible for the fit to take slighly longer * than maxtime. * * `id` should be an array of the particle ids (see id_particle.h for the * macros defining the particle types). * * On success returns 0, and on error returns NLOPT_FORCED_STOP. This error * is caused when the minimization is forced to halt when for example you * press ctrl-c. */ size_t i, j; fitParams fpars; double x[100], ss[100], lb[100], ub[100], fval, n_d2o, x0[100], T0, Tmin, mass, pos[3], t0, dir[3], Tmax; struct timeval tv_start, tv_stop; double time_elapsed; double peak_theta[MAX_NPEAKS]; double peak_phi[MAX_NPEAKS]; size_t npeaks; size_t *result; size_t nvertices; int status; int rv; /* Create the minimizer object. */ opt = nlopt_create(NLOPT_LN_BOBYQA, 4+3*n); nlopt_set_min_objective(opt,nlopt_nll2,&fpars); /* Guess the position and t0 of the event using the QUAD fitter. */ status = quad(ev,pos,&t0,10000,f); if (status || t0 > GTVALID || NORM(pos) > PSUP_RADIUS) { /* If the QUAD fitter fails or returns something outside the PSUP or * with an invalid time we just assume it's at the center. */ fprintf(stderr, "quad returned pos = %.2f, %.2f, %.2f t0 = %.2f. Assuming vertex is at the center!\n", pos[0], pos[1], pos[2], t0); pos[0] = 0.0; pos[1] = 0.0; pos[2] = 0.0; t0 = guess_t0(ev,pos); } /* Set the initial parameters for the parameters which don't change during * the fast minimization. */ x0[0] = pos[0]; x0[1] = pos[1]; x0[2] = pos[2]; x0[3] = t0; /* Set the initial step sizes for the parameters which don't change during * the fast minimization. */ ss[0] = 10.0; ss[1] = 10.0; ss[2] = 10.0; ss[3] = 1.0; /* Set the lower bound for the parameters which don't change during the * fast minimization. */ lb[0] = -1000.0; lb[1] = -1000.0; lb[2] = -1000.0; lb[3] = -100.0; /* Set the upper bound for the parameters which don't change during the * fast minimization. */ ub[0] = +1000.0; ub[1] = +1000.0; ub[2] = +1000.0; ub[3] = GTVALID; /* Find the peaks in the Hough transform of the event. */ find_peaks(ev, pos, t0, 100, 100, peak_theta, peak_phi, &npeaks, LEN(peak_theta), 0.1); /* Don't fit more than 3 peaks for now. */ if (npeaks > 3) npeaks = 3; result = malloc(sizeof(size_t)*n*ipow(npeaks,n)); /* Compute the set of all unique combinations of particles and directions. */ unique_vertices(id,n,npeaks,result,&nvertices); /* Compute the index of refraction in D2O. */ n_d2o = get_index_snoman_d2o(400.0); fpars.ev = ev; /* Set the global iteration count back to zero. * * FIXME: Some way to do this which is thread safe? */ iter = 0; /* First we do a set of "quick" minimizations to try and start the * minimizer close to the minimum. */ fpars.dx = 1.0; fpars.ns = 10; fpars.fast = 0; fpars.hit_only = 0; fpars.print = 0; fpars.charge_only = 0; nlopt_set_ftol_abs(opt, 1e-5); nlopt_set_xtol_rel(opt, 1e-2); nlopt_set_maxeval(opt, 1000); fpars.n = n; for (i = 0; i < n; i++) fpars.id[i] = id[i]; time_elapsed = 0.0; for (i = 0; i < nvertices; i++) { /* Copy the starting parameters to the `x` array. */ memcpy(x,x0,sizeof(x)); for (j = 0; j < n; j++) { x[5+3*j] = peak_theta[result[i*n+j]]; x[6+3*j] = peak_phi[result[i*n+j]]; dir[0] = sin(peak_theta[result[i*n+j]])*cos(peak_phi[result[i*n+j]]); dir[1] = sin(peak_theta[result[i*n+j]])*sin(peak_phi[result[i*n+j]]); dir[2] = cos(peak_theta[result[i*n+j]]); T0 = guess_energy(ev,x0,dir,id[j]); switch (id[j]) { case IDP_E_MINUS: case IDP_E_PLUS: mass = ELECTRON_MASS; Tmax = electron_get_max_energy(); break; case IDP_MU_MINUS: case IDP_MU_PLUS: mass = MUON_MASS; Tmax = muon_get_max_energy(); break; case IDP_PROTON: mass = PROTON_MASS; Tmax = proton_get_max_energy(); break; default: fprintf(stderr, "unknown particle id %i\n", id[j]); exit(1); } /* Calculate the Cerenkov threshold for a muon. */ Tmin = mass/sqrt(1.0-1.0/(n_d2o*n_d2o)) - mass; /* If our guess is below the Cerenkov threshold, start at the Cerenkov * threshold. */ double Tmin2 = sqrt(mass*mass/(1-pow(0.9,2)))-mass; if (T0 < Tmin2) T0 = Tmin2; if (T0 > Tmax) T0 = Tmax; x[4+3*j] = T0; ss[4+3*j] = x[4+3*j]*0.1; ss[5+3*j] = 0.1; ss[6+3*j] = 0.1; lb[4+3*j] = Tmin; lb[5+3*j] = -INFINITY; lb[6+3*j] = -INFINITY; ub[4+3*j] = Tmax; ub[5+3*j] = +INFINITY; ub[6+3*j] = +INFINITY; } nlopt_set_lower_bounds(opt, lb); nlopt_set_upper_bounds(opt, ub); nlopt_set_initial_step(opt, ss); gettimeofday(&tv_start, NULL); nlopt_optimize(opt,x,&fval); gettimeofday(&tv_stop, NULL); if (quit) { /* If ctrl-c was pressed, quit the fit. */ goto stop; } else if (stop && i > 0) { /* If ctrl-z was pressed, and we've already got at least 1 fit, move on * to the "real" minimization. */ stop = 0; break; } else if (stop) { /* If ctrl-z was pressed and we don't have a fit, quit the fit. */ goto stop; } long long elapsed = (tv_stop.tv_sec - tv_start.tv_sec)*1000 + (tv_stop.tv_usec - tv_start.tv_usec)/1000; time_elapsed += elapsed/1000.0; printf("%4zu/%4zu %7.2f %7.2f %7.2f %6.2f ", i+1, nvertices, x[0], x[1], x[2], x[3]); for (j = 0; j < n; j++) printf("%10.2f %7.2f %7.2f ", x[4+3*j], x[5+3*j], x[6+3*j]); printf("f() = %7.3e took %lld ms\n", fval, elapsed); if (i == 0 || fval < *fmin) { *fmin = fval; memcpy(xopt,x,sizeof(x)); } } /* Reset the lower and upper bounds. */ lb[0] = -1000.0; lb[1] = -1000.0; lb[2] = -1000.0; lb[3] = -100.0; ub[0] = +1000.0; ub[1] = +1000.0; ub[2] = +1000.0; ub[3] = GTVALID; /* Set the energy step size to 10% of the energy. */ for (j = 0; j < n; j++) { ss[4+3*j] = xopt[4+3*j]*0.1; } nlopt_set_lower_bounds(opt, lb); nlopt_set_upper_bounds(opt, ub); nlopt_set_initial_step(opt, ss); /* Now, we do the "real" minimization. */ fpars.dx = 1.0; fpars.ns = 10; fpars.fast = 0; fpars.print = 1; fpars.charge_only = 0; fpars.hit_only = 0; nlopt_set_ftol_abs(opt, 1e-5); nlopt_set_xtol_rel(opt, 1e-2); nlopt_set_maxeval(opt, 1000); nlopt_set_maxtime(opt, maxtime); memcpy(x,xopt,sizeof(x)); if (flikelihood) { FILE *f = fopen(flikelihood, "w"); for (i = 0; i < 50; i++) { for (j = 0; j < 50; j++) { x[5] = xopt[5] - 0.1 + 0.2*i/49; x[6] = xopt[6] - 0.1 + 0.2*j/49; fval = nlopt_nll2(4+3*n,x,NULL,&fpars); fprintf(f, "%.18g %.18g %.18g\n", x[5], x[6], fval); if (stop) goto close; } } close: fclose(f); if (stop) exit(1); exit(0); } gettimeofday(&tv_start, NULL); rv = nlopt_optimize(opt,x,&fval); gettimeofday(&tv_stop, NULL); time_elapsed += tv_stop.tv_sec - tv_start.tv_sec + (tv_stop.tv_usec - tv_start.tv_usec)/1e6; if (time_elapsed > maxtime || rv == NLOPT_MAXTIME_REACHED) goto end; if (stop) goto stop; do { *fmin = fval; memcpy(xopt,x,sizeof(x)); nlopt_set_maxtime(opt, maxtime-time_elapsed); gettimeofday(&tv_start, NULL); rv = nlopt_optimize(opt,x,&fval); gettimeofday(&tv_stop, NULL); time_elapsed += tv_stop.tv_sec - tv_start.tv_sec + (tv_stop.tv_usec - tv_start.tv_usec)/1e6; if (stop) goto stop; } while (fval < *fmin && fabs(fval-*fmin) > 1e-2 && time_elapsed < maxtime && rv != NLOPT_MAXTIME_REACHED); if (fval < *fmin) { *fmin = fval; memcpy(xopt,x,sizeof(x)); } if (time_elapsed > maxtime || rv == NLOPT_MAXTIME_REACHED) goto end; /* Now, minimize with SBPLX. * * The reason we minimize with a different algorithm is because occasionally * the BOBYQA minimizer seems to get stuck somewhere which doesn't appear to * be a local minima (this was noticed when fitting 300 MeV muons). * * Although SBPLX is *much* slower, the idea here is that if we really did * already find a local minimum, then SBPLX should be relatively fast. * * FIXME: Ideally we would just figure out and fix whatever is causing * BOBYQA to get stuck which would make things faster and be much better * since it would fix the initial multiple optimizations we do in order to * determine which particle id goes in which direction. */ nlopt_destroy(opt); opt = nlopt_create(NLOPT_LN_SBPLX, 4+3*n); nlopt_set_min_objective(opt,nlopt_nll2,&fpars); nlopt_set_lower_bounds(opt, lb); nlopt_set_upper_bounds(opt, ub); nlopt_set_initial_step(opt, ss); nlopt_set_ftol_abs(opt, 1e-5); nlopt_set_xtol_rel(opt, 1e-2); nlopt_set_maxeval(opt, 1000); nlopt_set_maxtime(opt, maxtime-time_elapsed); memcpy(x,xopt,sizeof(x)); gettimeofday(&tv_start, NULL); rv = nlopt_optimize(opt,x,&fval); gettimeofday(&tv_stop, NULL); time_elapsed += tv_stop.tv_sec - tv_start.tv_sec + (tv_stop.tv_usec - tv_start.tv_usec)/1e6; if (time_elapsed > maxtime || rv == NLOPT_MAXTIME_REACHED) goto end; if (stop) goto stop; do { *fmin = fval; memcpy(xopt,x,sizeof(x)); nlopt_set_maxtime(opt, maxtime-time_elapsed); gettimeofday(&tv_start, NULL); rv = nlopt_optimize(opt,x,&fval); gettimeofday(&tv_stop, NULL); time_elapsed += tv_stop.tv_sec - tv_start.tv_sec + (tv_stop.tv_usec - tv_start.tv_usec)/1e6; if (stop) goto stop; } while (fval < *fmin && fabs(fval-*fmin) > 1e-2 && time_elapsed < maxtime && rv != NLOPT_MAXTIME_REACHED); if (fval < *fmin) { *fmin = fval; memcpy(xopt,x,sizeof(x)); } end: free(result); nlopt_destroy(opt); return 0; stop: free(result); nlopt_destroy(opt); stop = 0; return NLOPT_FORCED_STOP; } int fit_event(event *ev, double *xopt, double *fmin, int id, double maxtime) { size_t i; fitParams fpars; double x[9], ss[9], lb[9], ub[9], fval, n, qhs_sum, x0[9], T0, Tmin, mass; struct timeval tv_start, tv_stop; double time_elapsed; opt = nlopt_create(NLOPT_LN_BOBYQA, 9); nlopt_set_min_objective(opt,nlopt_nll,&fpars); /* Make a guess as to the energy. Right now we just use a simple * approximation that the muon produces approximately 6 photons/MeV. * * FIXME: Should update this to something better. */ qhs_sum = 0.0; for (i = 0; i < MAX_PMTS; i++) { if (ev->pmt_hits[i].flags || pmts[i].pmt_type != PMT_NORMAL || !ev->pmt_hits[i].hit) continue; qhs_sum += ev->pmt_hits[i].q; } T0 = qhs_sum/6.0; n = get_index_snoman_d2o(400.0); switch (id) { case IDP_E_MINUS: case IDP_E_PLUS: mass = ELECTRON_MASS; break; case IDP_MU_MINUS: case IDP_MU_PLUS: mass = MUON_MASS; break; case IDP_PROTON: mass = PROTON_MASS; break; default: fprintf(stderr, "unknown particle id %i\n", id); exit(1); } /* Calculate the Cerenkov threshold for a muon. */ Tmin = mass/sqrt(1.0-1.0/(n*n)) - mass; /* If our guess is below the Cerenkov threshold, start at the Cerenkov * threshold. */ double Tmin2 = sqrt(mass*mass/(1-pow(0.9,2)))-mass; if (T0 < Tmin2) T0 = Tmin2; x0[0] = T0; x0[1] = 0.0; x0[2] = 0.0; x0[3] = 0.0; x0[4] = 1.57; x0[5] = 0.0; x0[6] = 130.0; x0[7] = 0.0; x0[8] = 0.0; ss[0] = x0[0]*0.02; ss[1] = 10.0; ss[2] = 10.0; ss[3] = 10.0; ss[4] = 0.01; ss[5] = 0.01; ss[6] = 1.0; ss[7] = 0.1; ss[8] = 0.1; lb[0] = Tmin; lb[1] = -1000.0; lb[2] = -1000.0; lb[3] = -1000.0; lb[4] = -INFINITY; lb[5] = -INFINITY; lb[6] = 0.0; lb[7] = -10.0; lb[8] = -10.0; ub[0] = 10000.0; ub[1] = 1000.0; ub[2] = 1000.0; ub[3] = 1000.0; ub[4] = INFINITY; ub[5] = INFINITY; ub[6] = 400.0; ub[7] = 10.0; ub[8] = 10.0; nlopt_set_lower_bounds(opt, lb); nlopt_set_upper_bounds(opt, ub); nlopt_set_initial_step(opt, ss); fpars.ev = ev; fpars.id[0] = id; fpars.n = 1; iter = 0; /* First we do a set of "quick" minimizations to try and start the * minimizer close to the minimum. To make these function evaluations * faster, we set the absolute tolerance on the likelihood to 1.0, the * maximum number of function evaluations to 100, and the relative * tolerance on the numerical integration to 10%. */ fpars.dx = 1.0; fpars.ns = 100; fpars.fast = 1; fpars.print = 0; fpars.charge_only = 0; fpars.hit_only = 1; nlopt_set_ftol_abs(opt, 1.0); nlopt_set_maxeval(opt, 20); for (i = 0; i < LEN(startingParameters); i++) { memcpy(x,x0,sizeof(x)); x[1] = startingParameters[i].x; x[2] = startingParameters[i].y; x[3] = startingParameters[i].z; /* Only fit for the direction and t0 when doing the "quick" * minimizations. To do this we set the lower bound equal to the upper * bound for these parameters which eliminates them from the * minimization. * * See https://nlopt.readthedocs.io/en/latest/NLopt_Reference/. */ lb[0] = T0; lb[1] = x[1]; lb[2] = x[2]; lb[3] = x[3]; lb[7] = 0.0; lb[8] = 0.0; ub[0] = T0; ub[1] = x[1]; ub[2] = x[2]; ub[3] = x[3]; ub[7] = 0.0; ub[8] = 0.0; nlopt_set_lower_bounds(opt, lb); nlopt_set_upper_bounds(opt, ub); guess_direction(ev,x+1,&x[4],&x[5]); x[6] = guess_t0(ev,x+1); gettimeofday(&tv_start, NULL); nlopt_optimize(opt,x,&fval); gettimeofday(&tv_stop, NULL); if (stop) goto stop; long long elapsed = (tv_stop.tv_sec - tv_start.tv_sec)*1000 + (tv_stop.tv_usec - tv_start.tv_usec)/1000; printf("%4zu/%4zu %7.2f %7.2f %7.2f %7.2f %5.2f %5.2f %6.2f %5.2f %5.2f f() = %7.3e took %lld ms\n", i+1, LEN(startingParameters), x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], fval, elapsed); if (i == 0 || fval < *fmin) { *fmin = fval; memcpy(xopt,x,sizeof(x)); } } /* Reset the lower and upper bounds. */ lb[0] = Tmin; lb[1] = -1000.0; lb[2] = -1000.0; lb[3] = -1000.0; lb[4] = -INFINITY; lb[5] = -INFINITY; lb[6] = 0.0; lb[7] = -10.0; lb[8] = -10.0; ub[0] = 10000.0; ub[1] = 1000.0; ub[2] = 1000.0; ub[3] = 1000.0; ub[4] = INFINITY; ub[5] = INFINITY; ub[6] = 400.0; ub[7] = 10.0; ub[8] = 10.0; nlopt_set_lower_bounds(opt, lb); nlopt_set_upper_bounds(opt, ub); /* Now, we do the "real" minimization. */ fpars.dx = 1.0; fpars.ns = 100; fpars.fast = 0; fpars.print = 1; fpars.charge_only = 0; fpars.hit_only = 0; nlopt_set_ftol_abs(opt, 1e-5); nlopt_set_xtol_rel(opt, 1e-2); nlopt_set_maxeval(opt, 1000); nlopt_set_maxtime(opt, maxtime); memcpy(x,xopt,sizeof(x)); gettimeofday(&tv_start, NULL); nlopt_optimize(opt,x,&fval); gettimeofday(&tv_stop, NULL); time_elapsed = tv_stop.tv_sec - tv_start.tv_sec + (tv_stop.tv_usec - tv_start.tv_usec)/1e6; if (time_elapsed > maxtime) goto end; if (stop) goto stop; do { *fmin = fval; memcpy(xopt,x,sizeof(x)); nlopt_set_maxtime(opt, maxtime-time_elapsed); gettimeofday(&tv_start, NULL); nlopt_optimize(opt,x,&fval); gettimeofday(&tv_stop, NULL); time_elapsed += tv_stop.tv_sec - tv_start.tv_sec + (tv_stop.tv_usec - tv_start.tv_usec)/1e6; if (stop) goto stop; } while (fval < *fmin && fabs(fval-*fmin) > 1e-2 && time_elapsed < maxtime); if (fval < *fmin) { *fmin = fval; memcpy(xopt,x,sizeof(x)); } end: nlopt_destroy(opt); return 0; stop: nlopt_destroy(opt); return NLOPT_FORCED_STOP; } void usage(void) { fprintf(stderr,"Usage: ./fit [options] FILENAME\n"); fprintf(stderr," -o output file\n"); fprintf(stderr," --max-time maximum time in seconds per fit (default: 3600)\n"); fprintf(stderr," --skip-second-event only fit the first event after a MAST bank\n"); fprintf(stderr," --max-particles maximum number of particles to fit for (default: 1)\n"); fprintf(stderr," --min-nhit minimum nhit to fit an event (default: 100)\n"); fprintf(stderr," --plot-likelihood FILENAME\n"); fprintf(stderr," scan the likelihood space and write out the results to FILENAME\n"); fprintf(stderr," --gtid only fit a single GTID\n"); fprintf(stderr," -p specify particle combo to fit for\n"); fprintf(stderr," -v verbose\n"); fprintf(stderr," -h display this help message\n"); exit(1); } void sigint_handler(int sig_num) { switch (sig_num) { case SIGINT: quit = 1; case SIGTSTP: stop = 1; break; } } void sprintf_particle_string(int *id, size_t n, char *str) { /* Convert a list of particle id codes to a string. * * This function is used when writing out the results for a multi particle * fit. Ideally we would use a set or something similar, but YAML doesn't * have support for that and lists can't be used as dictionary keys so * currently we just concatenate the integer representation of the * particles. For example: * * electron -> "20" * muon -> "22" * electron, muon -> "2022" * etc. * */ size_t i; sprintf(str,"%i",id[0]); for (i = 1; i < n; i++) sprintf(str+strlen(str),"%i",id[i]); } void sprintf_yaml_list(double *a, size_t n, size_t stride, char *str) { /* Write out a yaml list of doubles to the string pointed to by `str`. * * The array elements are accessed as a[i*stride] for i = 0,1,...,`n`. */ size_t i; if (n == 1) { sprintf(str,"%.2f",*a); return; } sprintf(str,"[%.2f",*a); for (i = 1; i < n; i++) sprintf(str+strlen(str),",%.2f",a[stride*i]); sprintf(str+strlen(str),"]"); } /* Convert a particle combo integer to an array of particle ids. * * Example: * * int id[MAX_VERTICES]; * particle_combo_to_array(2020,id); * * and then id should be equal to {20,20}. */ size_t particle_combo_to_array(int particle_combo, int *id) { size_t i; i = 0; while (particle_combo) { id[i++] = particle_combo % 100; particle_combo /= 100; } gsl_sort_int(id,1,i); return i; } /* Helper function to perform a fit for a single particle combination hypothesis. * * Arguments: * * ev - event * id - array of particle id's to fit for (see id_particle.h) * n - number of particles (maximum: 3) * fit_result - pointer to HDF5Fit result object to store fit results in * maxtime - maximum time in seconds to perform the minimization (after the * "quick" minimization phase) * fmin_best - the return value from nll_best() * f - the quantile to pass to quad() * * Returns the return value from fit_event2(). */ int do_fit(event *ev, int *id, size_t n, HDF5Fit *fit_result, double maxtime, double fmin_best, double f) { int rv; struct timeval tv_start, tv_stop; long long elapsed; double xopt[MAX_PARS]; double fmin; /* Fit the event. */ gettimeofday(&tv_start, NULL); rv = fit_event2(ev,xopt,&fmin,id,n,maxtime,f); gettimeofday(&tv_stop, NULL); if (rv == NLOPT_FORCED_STOP) return rv; elapsed = (tv_stop.tv_sec - tv_start.tv_sec)*1000 + (tv_stop.tv_usec - tv_start.tv_usec)/1000; fit_result->run = ev->run; fit_result->gtid = ev->gtid; fit_result->n = n; fit_result->x = xopt[0]; fit_result->y = xopt[1]; fit_result->z = xopt[2]; fit_result->t0 = xopt[3]; fit_result->id1 = id[0]; fit_result->energy1 = xopt[4]; fit_result->theta1 = xopt[5]; fit_result->phi1 = xopt[6]; if (n > 1) { fit_result->id2 = id[1]; fit_result->energy2 = xopt[7]; fit_result->theta2 = xopt[8]; fit_result->phi2 = xopt[9]; } else { fit_result->id2 = 0; fit_result->energy2 = NAN; fit_result->theta2 = NAN; fit_result->phi2 = NAN; } if (n > 2) { fit_result->id3 = id[2]; fit_result->energy3 = xopt[10]; fit_result->theta3 = xopt[11]; fit_result->phi3 = xopt[12]; } else { fit_result->id3 = 0; fit_result->energy3 = NAN; fit_result->theta3 = NAN; fit_result->phi3 = NAN; } fit_result->fmin = fmin; fit_result->time = elapsed; fit_result->psi = fmin-fmin_best; return rv; } int main(int argc, char **argv) { int i, j, k; zebraFile *f; zebraBank bmast, mc, bmcgn, mctk, b, rhdr; int rv; EVBank bev; FTPVBank bftpv; FTXKBank bftxk; RSPBank bftxr; MCBank bmc; MCTKBank bmctk; MCVXBank bmcvx; RHDRBank brhdr; event ev = {0}; char *filename = NULL; char *output = NULL; int skip_second_event = 0; double fmin_best; double maxtime = 3600.0; int max_particles = 1; int id[MAX_VERTICES]; size_t combos[100]; size_t len; size_t min_nhit = 100; int last_run; char dqxx_file[256]; int32_t gtid = -1; int particle_combo = 0; int verbose = 0; int nevents = 0; /* Array of events to write out to HDF5 file. * * Note: Declared static since otherwise it will cause a stack overflow. */ static HDF5Event hdf5_events[MAX_NEVENTS]; int nmcgn = 0; /* Array of primary seed tracks to write out to HDF5 file. * * Note: Declared static since otherwise it will cause a stack overflow. */ static HDF5MCGN hdf5_mcgn[MAX_NEVENTS]; int nfits = 0; /* Array of fit results to write out to HDF5 file. * * Note: Declared static since otherwise it will cause a stack overflow. */ static HDF5Fit hdf5_fits[MAX_NEVENTS]; int nrhdr = 0; /* Array of run header info to write out to HDF5 file. * * Note: Declared static since otherwise it will cause a stack overflow. */ static HDF5RHDR hdf5_rhdr[MAX_NEVENTS]; for (i = 1; i < argc; i++) { if (strlen(argv[i]) >= 2 && !strncmp(argv[i], "--", 2)) { if (!strcmp(argv[i]+2,"skip-second-event")) { skip_second_event = 1; continue; } else if (!strcmp(argv[i]+2,"max-time")) { maxtime = strtod(argv[++i],NULL); continue; } else if (!strcmp(argv[i]+2,"max-particles")) { max_particles = atoi(argv[++i]); continue; } else if (!strcmp(argv[i]+2,"min-nhit")) { min_nhit = atoi(argv[++i]); continue; } else if (!strcmp(argv[i]+2,"plot-likelihood")) { flikelihood = argv[++i]; continue; } else if (!strcmp(argv[i]+2,"gtid")) { gtid = atoi(argv[++i]); continue; } } else if (argv[i][0] == '-') { switch (argv[i][1]) { case 'o': output = argv[++i]; break; case 'p': particle_combo = atoi(argv[++i]); break; case 'v': verbose = 1; break; case 'h': usage(); default: fprintf(stderr, "unrecognized option '%s'\n", argv[i]); exit(1); } } else { filename = argv[i]; } } if (!filename) usage(); if (max_particles > MAX_VERTICES) { fprintf(stderr, "max_particles must be less than or equal to %i\n", MAX_VERTICES); exit(1); } signal(SIGPIPE, SIG_IGN); signal(SIGINT, sigint_handler); signal(SIGTSTP, sigint_handler); f = zebra_open(filename); if (!f) { fprintf(stderr, "%s\n", zebra_err); return 1; } if (load_pmt_info()) { zebra_close(f); return 1; } for (i = 0; i < MAX_PMTS; i++) { ev.pmt_hits[i].hit = 0; ev.pmt_hits[i].flags = 0; } ev.run = -1; init_interpolation(); init_charge(); dict *db = db_init(); last_run = -1; if (load_file(db, "pmt_response_qoca_d2o_20060216.dat", 0)) { fprintf(stderr, "failed to load pmt_response_qoca_d2o_20060216.dat: %s\n", db_err); goto err; } if (load_file(db, "rsp_rayleigh.dat", 0)) { fprintf(stderr, "failed to load rsp_rayleigh.dat: %s\n", db_err); goto err; } if (pmt_response_init(db)) { fprintf(stderr, "failed to initialize PMTR bank: %s\n", pmtr_err); goto err; } if (optics_init()) { fprintf(stderr, "failed to initialize optics: %s\n", optics_err); goto err; } while (1) { rv = zebra_read_next_logical_record(f); if (rv == -1) { fprintf(stderr, "error getting logical record: %s\n", zebra_err); goto err; } else if (rv == 1) { /* EOF */ break; } if (f->mast_bank == -1) { fprintf(stderr, "no MAST bank in logical record! Skipping...\n"); continue; } rv = zebra_get_bank(f, &bmast, f->mast_bank); if (rv) { fprintf(stderr, "error getting MAST bank: %s\n", zebra_err); goto err; } if (bmast.links[KMAST_RHDR-1] != 0) { rv = zebra_get_bank(f,&rhdr,bmast.links[KMAST_RHDR-1]); if (rv) { fprintf(stderr, "error getting RHDR bank: %s\n", zebra_err); goto err; } unpack_rhdr(rhdr.data, &brhdr); hdf5_rhdr[nrhdr].run = brhdr.run_number; hdf5_rhdr[nrhdr].run_mask = brhdr.run_mask; hdf5_rhdr[nrhdr].first_gtid = brhdr.first_gt; nrhdr += 1; continue; } if (bmast.links[KMAST_EV-1] == 0) { /* First logical record in SNOCR files don't have an EV bank. */ continue; } if (bmast.links[KMAST_MC-1] == 0) goto skip_mc; rv = zebra_get_bank(f,&mc,bmast.links[KMAST_MC-1]); if (rv) { fprintf(stderr, "error getting MC bank: %s\n", zebra_err); goto err; } unpack_mc(mc.data, &bmc); if (bmast.links[KMC_MCGN-1] == 0) { fprintf(stderr, "MCGN link is zero!\n"); goto err; } rv = zebra_get_bank(f,&bmcgn,mc.links[KMC_MCGN-1]); if (rv) { fprintf(stderr, "error getting MCGN bank: %s\n", zebra_err); goto err; } while (1) { if (bmcgn.links[KMCGN_MCTK-1] == 0) { fprintf(stderr, "MCTK link is zero!\n"); goto err; } rv = zebra_get_bank(f,&mctk,bmcgn.links[KMCGN_MCTK-1]); if (rv) { fprintf(stderr, "error getting MCTK bank: %s\n", zebra_err); goto err; } if (mctk.orig == mctk.up - KMCVX_MCTK) { /* This is the first MCTK bank. */ unpack_mctk(mctk.data, &bmctk); } else { /* For some reason SNOMAN sometimes links to the second MCTK * from the MCGN bank. */ rv = zebra_get_bank(f,&b,mctk.orig); if (b.idh != MCTK_RECORD) { fprintf(stderr, "error following origin link from MCTK bank!\n"); goto err; } if (rv) { fprintf(stderr, "error getting MCTK bank: %s\n", zebra_err); goto err; } unpack_mctk(b.data, &bmctk); } if (mctk.up == 0) { fprintf(stderr, "MCVX link is zero!\n"); goto err; } rv = zebra_get_bank(f,&b,mctk.up); if (rv) { fprintf(stderr, "error getting MCVX bank: %s\n", zebra_err); goto err; } unpack_mcvx(b.data, &bmcvx); if (output) { hdf5_mcgn[nmcgn].evn = bmc.evn; hdf5_mcgn[nmcgn].id = bmctk.idp; hdf5_mcgn[nmcgn].energy = bmctk.ene; hdf5_mcgn[nmcgn].x = bmcvx.x; hdf5_mcgn[nmcgn].y = bmcvx.y; hdf5_mcgn[nmcgn].z = bmcvx.z; hdf5_mcgn[nmcgn].dirx = bmctk.drx; hdf5_mcgn[nmcgn].diry = bmctk.dry; hdf5_mcgn[nmcgn].dirz = bmctk.drz; hdf5_mcgn[nmcgn].time = bmcvx.tim; nmcgn++; } if (bmcgn.next) { rv = zebra_get_bank(f,&bmcgn,bmcgn.next); if (rv) { fprintf(stderr, "error getting MCGN bank: %s\n", zebra_err); goto err; } } else { break; } } skip_mc: rv = zebra_get_bank(f,&b,bmast.links[KMAST_EV-1]); if (rv) { fprintf(stderr, "error getting EV bank: %s\n", zebra_err); goto err; } /* Skip to the last event so we can traverse them in reverse order. The * reason for this is that for some reason SNOMAN puts the events in * reverse order within each logical record. */ while (b.next) { rv = zebra_get_bank(f,&b,b.next); if (rv) { fprintf(stderr, "error getting EV bank: %s\n", zebra_err); goto err; } } while (1) { unpack_ev(b.data, &bev); if (gtid > 0 && bev.gtr_id != gtid) goto skip_event; if (bev.run != last_run) { printf("loading DQXX file for run %010i\n", bev.run); sprintf(dqxx_file, "DQXX_%010i.dat", bev.run); if (load_file(db, dqxx_file, 1)) { fprintf(stderr, "failed to load %s: %s\n", dqxx_file, db_err); goto err; } if (dqxx_init(db, &ev)) { fprintf(stderr, "failed to initialize DQXX bank: %s\n", dqxx_err); goto err; } last_run = bev.run; } if (get_event(f,&ev,&b)) goto skip_event; if (output) { hdf5_events[nevents].run = ev.run; hdf5_events[nevents].sub_run = ev.sub_run; hdf5_events[nevents].evn = bmc.evn; hdf5_events[nevents].gtr = ev.trigger_time; hdf5_events[nevents].nhit = ev.nhit; hdf5_events[nevents].nhit_cal = ev.nhit_cal; hdf5_events[nevents].gtid = ev.gtid; hdf5_events[nevents].trg_type = ev.trigger_type; hdf5_events[nevents].dc = get_dc_word(&ev, f, &bmast, &b); if (get_ftpv(f,&b,&bftpv)) { if (verbose) fprintf(stderr, "%s\n", zdab_err); hdf5_events[nevents].ftp_x = NAN; hdf5_events[nevents].ftp_y = NAN; hdf5_events[nevents].ftp_z = NAN; } else { hdf5_events[nevents].ftp_x = bftpv.x; hdf5_events[nevents].ftp_y = bftpv.y; hdf5_events[nevents].ftp_z = bftpv.z; } if (get_ftxk(f,&b,&bftxk)) { if (verbose) fprintf(stderr, "%s\n", zdab_err); hdf5_events[nevents].ftk_energy = NAN; } else { hdf5_events[nevents].ftk_energy = bftxk.energy; } if (get_rsp(f,&b,&bftxr)) { if (verbose) fprintf(stderr, "%s\n", zdab_err); hdf5_events[nevents].rsp_energy = NAN; } else { hdf5_events[nevents].rsp_energy = bftxr.ene; } nevents++; } if (ev.nhit < min_nhit) goto skip_event; fmin_best = nll_best(&ev); if (particle_combo) { i = particle_combo_to_array(particle_combo,id); /* We call do_fit() twice here because we want to fit both when * quad is called normally, and when we cut on the first 10% * quantile of times. The first way is much much better when * the event is fully contained since quad will return a really * good starting point, and the second is much better for muons * where we want to seed the fit near the entry point of the * muon. * * FIXME: Ideally we would only need a single call and I have * an idea of how to update QUAD to maybe return reasonable * guesses in both cases. The idea is to take the cloud of quad * points and find the position and time that has the smallest * time such that it is only a certain Mahalabonis distance * from the distribution. This (I think) corresponds roughly to * what I would do by eye where you look at the distribution of * quad points in the cloud and see that it forms a track, and * pick a point at the start of the track. */ if (do_fit(&ev,id,i,hdf5_fits+nfits,maxtime,fmin_best,1.0) != NLOPT_FORCED_STOP) nfits++; if (do_fit(&ev,id,i,hdf5_fits+nfits,maxtime,fmin_best,0.1) != NLOPT_FORCED_STOP) nfits++; if (quit) { printf("ctrl-c caught. quitting...\n"); goto end; } if (output) save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, hdf5_fits, nfits, hdf5_rhdr, nrhdr); } else { /* Loop over 1,2,...,max_particles particle hypotheses. */ for (i = 1; i <= max_particles; i++) { /* Find all unique combinations of i particles. */ combinations_with_replacement(LEN(particles),i,combos,&len); for (j = 0; j < len; j++) { /* Set up the id array with the particle id codes. */ for (k = 0; k < i; k++) { id[k] = particles[combos[j*i+k]]; } if (do_fit(&ev,id,i,hdf5_fits+nfits,maxtime,fmin_best,1.0) != NLOPT_FORCED_STOP) nfits++; if (do_fit(&ev,id,i,hdf5_fits+nfits,maxtime,fmin_best,0.1) != NLOPT_FORCED_STOP) nfits++; if (quit) { printf("ctrl-c caught. quitting...\n"); goto end; } if (output) save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, hdf5_fits, nfits, hdf5_rhdr, nrhdr); } } } skip_event: /* Note the origin link for the first EV bank points back to the * structural link location in the MAST bank. These links are super * confusing! */ if ((b.orig == f->mast_bank - KMAST_EV) || skip_second_event) break; rv = zebra_get_bank(f,&b,b.orig); if (rv) { fprintf(stderr, "error getting EV bank: %s\n", zebra_err); goto err; } } } end: if (output) save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, hdf5_fits, nfits, hdf5_rhdr, nrhdr); free_interpolation(); pmt_response_free(); db_free(db); zebra_close(f); return 0; err: free_interpolation(); pmt_response_free(); db_free(db); zebra_close(f); return 1; }